0

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

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

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

这似乎是处理这个问题的最佳方法吗?或者这里的专家很快就会听到更好的声音。谢谢!

4

3 回答 3

1

您首先需要确定一个简单的一对多关系是否足以满足您的需求。

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

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

您的模型应如下所示:

class Computer < ActiveRecord::Base
    belongs_to :student
end

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

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

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

于 2012-05-29T16:05:58.153 回答
0

You can also use has_and_belongs_to_many method. In your case it will be:

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

or you can rename assignments table to computers_students and remove 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
于 2012-05-29T13:26:56.440 回答
0

实际上,您的方法很好,正如@alexkv. 这是更多的讨论,而不是问题。

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

来自 api.rubyonrails.org:

选择建立多对多关系的方式并不总是那么简单。如果您需要将关系模型作为自己的实体使用,请使用 has_many :through。在处理遗留模式或从不直接处理关系本身时使用 has_and_belongs_to_many。

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

于 2012-05-29T13:55:25.157 回答