Rails: создание миграций для has_many и has_one - PullRequest
0 голосов
/ 02 мая 2019

У меня есть следующие модели Question, Option и Answer:

class Question < ApplicationRecord
  belongs_to :user
  has_many :options
  has_one :answer
end

class Option < ApplicationRecord
  belongs_to :question
  has_many :answers
end

class Answer < ApplicationRecord
  belongs_to :question
  belongs_to :option
end

У меня есть один файл миграции для моделей Question и Option, подобных этой:

class CreateQuestions < ActiveRecord::Migration[5.2]
  def change
    create_table :questions do |t|
      t.text :body
      t.references :user, foreign_key: true

      t.timestamps
    end
  end
end

class CreateOptions < ActiveRecord::Migration[5.2]
  def change
    create_table :options do |t|
      t.references :question, foreign_key: true

      t.timestamps
    end
  end
end

Если мое понимание верно, у меня есть миграция для ассоциации belongs_to.Я сомневаюсь, достаточно ли этих файлов миграции для создания ассоциаций has_many или мне нужно добавить какие-либо дополнительные условия в файлы migrations?Если да, скажите, пожалуйста, что добавить.Я сослался на следующую ссылку: [ Приложение в стиле рельсового опроса - Показать все ответы по опции

[1]: https://https://stackoverflow.com/questions/35771847/rails-survey-style-application-show-all-answers-on-option, но я не понял, нужно ли мне добавлять дополнительныестрока для has_many и has_one ассоциаций.

1 Ответ

1 голос
/ 02 мая 2019

Ваши миграции верны, потому что если вы думаете о своих моделях, как о таблицах базы данных, вы никогда не будете хранить где-либо опцию has_many. Это просто для человеческого понимания, а также для ActiveRecord. Таким образом, вариант в вашем примере относится к вопросу, поэтому мы должны сохранить идентификатор этого вопроса в записи ответа. Однако при переносе вопросов мы не храним никакой информации о параметре, достаточно, чтобы параметр «знал», к какому вопросу он относится. (И то же самое для пользователя и вопроса).

Только в модели вы можете указать - как вы это сделали - параметры has_many. Это позволит вам позже вызвать 'question.options`, чтобы получить все опции, относящиеся к вопросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...