适当的Rails协会使用

时间:2012-05-29 13:18:04

标签: ruby-on-rails ruby-on-rails-3 has-many-through

我正在尝试在两个表之间创建关联。学生桌和电脑桌。 计算机只能分配给一个学生(任何时候),但学生可以分配到多台计算机。

这是我目前的想法。建立一个有很多通过关系并稍微修改它。

class Student < ActiveRecord::Base
  has_many :assignemnts
  has_many :computers, :through => :assignments
end

class Computer < ActiveRecord::Base
 has_one :assignment
 has_one :student, :through => :assignments
end

class Assignment < ActiveRecord::Base
  belongs_to :student
  belongs_to :computer
end

这似乎是解决此问题的最佳方法吗?或者更好的声音在这里向专家们发出更快的声音。谢谢!

3 个答案:

答案 0 :(得分:1)

首先需要确定简单的一对多关系是否适合您。

如果是,它会变得更容易,因为你可以摆脱Assignment-class和table。

您的数据库表“计算机”需要一个student_id列,并且具有非唯一索引

您的模型应如下所示:

class Computer < ActiveRecord::Base
    belongs_to :student
end

class Student < ActiveRecord::Base
    has_many :computers, :dependent => :nullify
end

“依赖无效”,因为您不想在删除学生时删除计算机,而是将其标记为免费。

您的每台计算机只能分配给一名学生,但您可以将其重新分配给其他学生,例如明年。

答案 1 :(得分:0)

您也可以使用has_and_belongs_to_many方法。在你的情况下,它将是:

class Student < ActiveRecord::Base
    has_many :assignemnts
    has_and_belongs_to_many :computers, :join_table => 'assignments',
end

class Computer < ActiveRecord::Base
    has_one :assignment
    has_and_belongs_to_many :student, :join_table => 'assignments',
end

或者您可以将分配表重命名为computers_students并删除join_table

class Student < ActiveRecord::Base
    has_many :assignemnts
    has_and_belongs_to_many :computers
end

class Computer < ActiveRecord::Base
    has_one :assignment
    has_and_belongs_to_many :student
end

答案 2 :(得分:0)

实际上你的方法很好,就像@alexkv提供的方法一样。这是更多的讨论,而不是问题。

如果你想将映射表用于其他目的,比如存储其他字段,那么另外一件事 - 那么你的方法是最好的。在has_many :through表中,连接模型有一个主键,可以像任何其他模型一样包含属性。

来自api.rubyonrails.org:

  

选择构建多对多关系的方式并非总是如此   简单。如果您需要将关系模型作为自己的工作   实体,使用has_many:通过。使用has_and_belongs_to_many时   使用遗留模式或当您从未直接使用   关系本身。

我可以建议您阅读本文,了解在您的情况下更好地选择哪种方法: