我在Rails中创建了一个应用程序并生成了两个模型,一个用于学生,一个用于奖励。
rails students
script/generate scaffold student given_name:string middle_name:string family_name:string date_of_birth:date grade_point_average:decimal start_date:date
script/generate scaffold award name:string year:integer student_id:integer
每个学生都可以获得许多奖项,因此我将has_many:奖项添加到学生模型中。我还在视图中添加了一个选择框,让用户可以创建新奖项:
<%= f.select :student_id, Student.find(:all).collect {|s| [s.name, s.id]} %>
我的问题:如果我想让用户选择创建奖励而不指定学生,我如何修改选择框以允许他们这样做?
我是Rails的新手。谢谢!
答案 0 :(得分:1)
你所描述的是多对多的关系。你所做的只是一对多的关系。
在多对多关系中,您可以在每一侧定义许多独立记录,并使用连接表创建从一个到另一个的链接。
在一对多的关系中,一方的每条记录都是独立的,而多方的每条记录都依赖于它所链接的记录。
源于您的问题的例子:
多对多:每个学生都可以获得许多奖励,但不需要与奖励相关联才能有意义。每个奖项都可以由许多学生获得,但不需要与学生联系以获得意义。 StackOverflow的徽章就是一个很好的例子。
一对多:每个学生都可以获得许多奖励,但不需要与奖项相关联才能有意义。每个奖项只有一名学生独有。
如何将您的关系转变为多对多的关系:
student_id
和award_id
列的奖励表。通知ActiveRecord关系。
class Student < ActiveRecord::Base
has_many :awardings
has_many :awards, :through => :awardings
...
end
class Awarding < ActiveRecord::Base
belongs_to :student
belongs_to :award
end
class Award < ActiveRecord::Base
has_many :awardings
has_many :students, :through => :awardings
end
更新您的表单以反映更改。
使用多选框或一系列复选框一次管理多个复选框。有很多关于此的教程。这Railscast episode已经过时,但是一个良好的开端。
P.S。如果您不查看社区维基盒,则更有可能获得答案。社区wiki是针对非技术性问题的,其答案可能会被多个用户改进。