使用选择框(RoR)

时间:2009-12-01 22:07:04

标签: ruby-on-rails

我在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的新手。谢谢!

1 个答案:

答案 0 :(得分:1)

你所描述的是多对多的关系。你所做的只是一对多的关系。

在多对多关系中,您可以在每一侧定义许多独立记录,并使用连接表创建从一个到另一个的链接。

在一对多的关系中,一方的每条记录都是独立的,而多方的每条记录都依赖于它所链接的记录。

源于您的问题的例子:

多对多:每个学生都可以获得许多奖励,但不需要与奖励相关联才能有意义。每个奖项都可以由许多学生获得,但不需要与学生联系以获得意义。 StackOverflow的徽章就是一个很好的例子。

一对多:每个学生都可以获得许多奖励,但不需要与奖项相关联才能有意义。每个奖项只有一名学生独有。

如何将您的关系转变为多对多的关系:

  1. 创建一个包含student_idaward_id列的奖励表。
  2. 从奖励表中删除student_id列。
  3. 通知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
    
  4. 更新您的表单以反映更改。

    使用多选框或一系列复选框一次管理多个复选框。有很多关于此的教程。这Railscast episode已经过时,但是一个良好的开端。

  5. P.S。如果您不查看社区维基盒,则更有可能获得答案。社区wiki是针对非技术性问题的,其答案可能会被多个用户改进。