Рекомендуемый способ создания объединенной таблицы с использованием ruby ​​на рельсах: рельсы создают эшафот, рельсы создают модель или рельсы генерируют миграцию? - PullRequest
0 голосов
/ 22 октября 2018

Я хочу создать третью таблицу, в которой указано отношение «многие ко многим» между таблицей A и таблицей B. Скажем, таблица A соответствует модели курса, а таблица B - таблице Subject.Какой из следующих способов вы рекомендуете создать третью объединенную таблицу:

  1. рельсы генерируют каркас Course_subject course_id: integer subject_id: integer
  2. рельсы генерируют модельрельсы генерируют миграцию понимание course_subject

Насколько я понимаю, использование опции 1 сгенерирует контроллер, модель и представление;опция 2 не генерирует контроллер, поэтому, если я хочу увидеть результат на веб-сайте, мне нужно будет создать файл представления вручную;Варианты 3 просто генерируют файл миграции, ничего больше.Я правильно понимаю?И вариант 1 более удобен или не нужен?

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Команда 1 создает ресурс с нуля: миграция, модель, маршрутизация, контроллер и представления.Он также создает тесты и некоторые ресурсы:

$ rails g scaffold course_subject course_id:integer subject_id:integer
  invoke  active_record
  create    db/migrate/20181022020611_create_course_subjects.rb
  create    app/models/course_subject.rb
  invoke    test_unit
  create      test/models/course_subject_test.rb
  create      test/fixtures/course_subjects.yml
  invoke  resource_route
   route    resources :course_subjects
  invoke  scaffold_controller
  create    app/controllers/course_subjects_controller.rb
  invoke    erb
  create      app/views/course_subjects
  create      app/views/course_subjects/index.html.erb
  create      app/views/course_subjects/edit.html.erb
  create      app/views/course_subjects/show.html.erb
  create      app/views/course_subjects/new.html.erb
  create      app/views/course_subjects/_form.html.erb
  invoke    test_unit
  create      test/controllers/course_subjects_controller_test.rb
  create      test/system/course_subjects_test.rb
  invoke    helper
  create      app/helpers/course_subjects_helper.rb
  invoke      test_unit
  invoke    jbuilder
  create      app/views/course_subjects/index.json.jbuilder
  create      app/views/course_subjects/show.json.jbuilder
  create      app/views/course_subjects/_course_subject.json.jbuilder
  invoke  assets
  invoke    coffee
  create      app/assets/javascripts/course_subjects.coffee
  invoke    scss
  create      app/assets/stylesheets/course_subjects.scss
  invoke  scss
  create    app/assets/stylesheets/scaffolds.scss

Команда 2 создает миграцию, модель и тест для модели:

$ rails g model course_subject
  invoke  active_record
  create    db/migrate/20181022020655_create_course_subjects.rb
  create    app/models/course_subject.rb
  invoke    test_unit
  create      test/models/course_subject_test.rb
  create      test/fixtures/course_subjects.yml

Команда 3 создает только миграцию:

$ rails g migration course_subject
  invoke  active_record
  create    db/migrate/20181022020717_course_subject.rb

Какой вариант выбрать, зависит от ассоциации, которую вы собираетесь использовать.Для простой has_and_belongs_to_many связи вам не нужна модель для таблицы соединений.Тогда просто создайте миграцию - команда 3 - ваш выбор.Обратите внимание, что таблица соединения должна соответствовать некоторым правилам именования и в этом случае иметь имя courses_subjects.Пример миграции:

create_table courses_subjects, id: false do |t|
  t.references  :course
  t.references  :subject
end

(Поля id, created_at и updated_at не создаются, поскольку они здесь не нужны)

В противном случае, если по какой-либо причине вы 'Если у вас будет доступ к таблице соединений с использованием класса модели или для has_many ... through связи, вам также потребуется создать модель.Поэтому используйте команду 2.

0 голосов
/ 22 октября 2018

Да, вы делаете это правильно.Все они верны, пока это служит своей цели.Это сводится к тому, чего вы хотите достичь.

Вариант 1 даст вам все, что вам нужно, но это даст вам ненужные views.В рельсах у вас все еще есть контроль над вашими файлами / кодом.Для удаления файла достаточно одного клика.Scaffolding - это всего лишь инструмент, помогающий нам разрабатывать приложения с меньшими усилиями.

Если это базовая ассоциация, в которой у вас есть только внешние ключи, вы можете использовать опцию 2. Сгенерировать модель с миграцией.Вы можете сгенерировать контроллер позже, когда вам это понадобится.

Опция 3 создаст миграцию, но не будет включать модель CourseSubject.Вы должны создать это самостоятельно.Модель Course и Subject должна определять ассоциации has_many и модель CourseSubject с ассоциацией belongs_to.Это сделает course.subjects цепочкой работ.

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