【问题标题】:Recommended way to create a joint table using ruby on rails: rails generate scaffold, rails generate model, or rails generate migration?推荐使用 ruby​​ on rails 创建关节表的方法:rails 生成脚手架,rails 生成模型,或 rails 生成迁移?
【发布时间】:2019-03-26 00:41:36
【问题描述】:

我想创建第三个表来表示表 A 和表 B 之间的多对多关系。假设表 A 对应于 Course 模型,表 B 对应于 Subject 表。您推荐以下哪种方式生成第三联表:

  1. rails 生成脚手架 Course_subject course_id:integer subject_id:integer
  2. rails 生成模型 course_subject
  3. rails 生成迁移课程_学科理解

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

【问题讨论】:

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


    【解决方案1】:

    是的,你做得对。只要符合其目的,它们都是正确的。它归结为你想要完成的事情。

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

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

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

    class CourseSubject
      belongs_to :course
      belongs_to :subject
    end
    

    【讨论】:

    • 谢谢@neume。我是否还需要将“belongs_to”关联添加到“course_subject”的迁移文件中?我这样做了,它在部署在 heroku 上时会正确迁移:'class CreateCourseSubjects
    【解决方案2】:

    命令 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。

    【讨论】:

      猜你喜欢
      • 2013-04-18
      • 2012-12-27
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      • 2013-12-15
      • 2014-08-23
      • 1970-01-01
      • 2013-02-16
      相关资源
      最近更新 更多