我想创建第三个表以指示表A和表B之间的多对多关系。说表A对应于课程模型,表B对应于主题表。建议您使用以下哪种方式生成第三张联合表:
我的理解是,使用选项1将生成控制器,模型和视图;选项2不会生成控制器,因此如果我想在网站上查看结果,则需要手动创建视图文件;选项3仅生成迁移文件,仅此而已。我能正确得到这个吗?选项1更方便还是不必要?
答案 0 :(得分:4)
是的,您做得正确。只要符合其目的,它们都是正确的。归结为您要完成的工作。
选项1将为您提供所需的一切,但这将为您提供不必要的views
。在Rails中,您仍然可以控制文件/代码。只需单击一下即可删除文件。脚手架只是一种工具,可以帮助我们轻松开发应用程序。
如果这是仅具有外键的基本关联,则可以使用选项2。通过迁移生成模型。您可以稍后在需要时生成控制器。
选项3将生成迁移,但不包括CourseSubject
模型。您必须自己创建它。 Course
和Subject
模型应定义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
(未创建字段id
,created_at
和updated_at
,因为此处没有必要)
否则,如果由于某种原因您将有权使用模型类或has_many ... through
关联来访问表,则还需要创建一个模型。因此,请使用命令2。