Вопрос:

Как настроить сопоставления моделей таким образом, чтобы у ответа has_one: option и Option has_many: answers?

ruby-on-rails

19 просмотра

1 ответ

177 Репутация автора

Я пытаюсь настроить свою модель так, чтобы в поле «Ответ есть has_one: опция», а в параметре «has_many: ответы». Они объединяются через таблицу AnsptedOptions. Вот три модели:

class Answer < ActiveRecord::Base

  has_many :answered_options
  has_one :option, through: :answered_options, source: :options

  belongs_to :question

end

class Option < ActiveRecord::Base
  belongs_to :question
  has_many :answered_options
  has_many :answers, through: :answered_options, source: :answers
end

class AnsweredOption < ActiveRecord::Base
  belongs_to :answer
  belongs_to :option
end

Сначала я попробовал обе вышеупомянутые модели без источника, но я получаю ту же ошибку, о которой я расскажу ниже через минуту.

схема для answer_options:

create_table "answered_options", force: :cascade do |t|
    t.integer  "answer_id"
    t.integer  "option_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
end

Вот ошибка, которую я получаю, когда я запускаю Answer.first.option в консоли:

ActiveRecord::HasManyThroughSourceAssociationNotFoundError: Could not find the source association(s) :options in model AnsweredOption. Try 'has_many :option, :through => :answered_options, :source => <name>'

Вот ошибка, которую я получаю при запуске Option.first.answers:

ActiveRecord::HasManyThroughSourceAssociationNotFoundError: Could not find the source association(s) :answers in model AnsweredOption. Try 'has_many :answers, :through => :answered_options, :source => <name>

Я добавил параметр source: в свои ассоциации после получения этих сообщений об ошибках, но это ничего не изменило. Что я здесь не так делаю? Спасибо за помощь.

Автор: srlrs20020 Источник Размещён: 22.08.2016 08:51

Ответы (1)


1 плюс

4571 Репутация автора

Решение

Если вам просто нужен вариант ответа has_one: и Option has_many: answers. Вам не нужно AnsptedOption. Вам просто нужно создать просто отношения has_one и has_many.

class Answer < ActiveRecord::Base
  has_one :option
  belongs_to :question
end

class Option < ActiveRecord::Base
  belongs_to :question
  has_many :answers
end

Вам не нужно создавать класс AnsptedOption. Он предназначен служить связующим звеном между классами Option и Answer, но он используется в случае отношения «многие ко многим», так как у опции есть много ответов, а у ответа много опций.

Автор: davidhu2000 Размещён: 22.08.2016 09:05
Вопросы из категории :
32x32