在轨道上使用红宝石创建联合表的推荐方法:轨道生成支架,轨道生成模型或轨道生成迁移?

时间:2018-10-21 23:48:06

标签: ruby-on-rails activerecord many-to-many

我想创建第三个表以指示表A和表B之间的多对多关系。说表A对应于课程模型,表B对应于主题表。建议您使用以下哪种方式生成第三张联合表:

  1. 导轨生成支架Course_subject course_id:integer subject_id:integer
  2. 轨道生成模型course_subject
  3. 铁路产生迁移性Course_subject了解

我的理解是,使用选项1将生成控制器,模型和视图;选项2不会生成控制器,因此如果我想在网站上查看结果,则需要手动创建视图文件;选项3仅生成迁移文件,仅此而已。我能正确得到这个吗?选项1更方便还是不必要?

2 个答案:

答案 0 :(得分:4)

是的,您做得正确。只要符合其目的,它们都是正确的。归结为您要完成的工作。

选项1将为您提供所需的一切,但这将为您提供不必要的views。在Rails中,您仍然可以控制文件/代码。只需单击一下即可删除文件。脚手架只是一种工具,可以帮助我们轻松开发应用程序。

如果这是仅具有外键的基本关联,则可以使用选项2。通过迁移生成模型。您可以稍后在需要时生成控制器。

选项3将生成迁移,但不包括CourseSubject模型。您必须自己创建它。 CourseSubject模型应定义has_many关联,而CourseSubject模型应具有belongs_to关联。这将使course.subjects链接有效。

class CourseSubject
  belongs_to :course
  belongs_to :subject
end

答案 1 :(得分:0)

命令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是您的选择。请注意,联接表应跟随某些naming rules,在这种情况下应命名为courses_subjects。迁移示例:

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

(未创建字段idcreated_atupdated_at,因为此处没有必要)

否则,如果由于某种原因您将有权使用模型类或has_many ... through关联来访问表,则还需要创建一个模型。因此,请使用命令2。