我正在尝试在两个表之间创建关联。学生桌和电脑桌。 计算机只能分配给一个学生(任何时候),但学生可以分配到多台计算机。
这是我目前的想法。建立一个有很多通过关系并稍微修改它。
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
这似乎是解决此问题的最佳方法吗?或者更好的声音在这里向专家们发出更快的声音。谢谢!
答案 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时 使用遗留模式或当您从未直接使用 关系本身。
我可以建议您阅读本文,了解在您的情况下更好地选择哪种方法: