2012-05-29 63 views
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 

这是否似乎是处理此问题的最佳方法?或者更好的东西迅速响应这里的专家。谢谢!

回答

1

您需要首先,如果一个简单的决定对于许多关系来说已经足够了。

如果是的话,它会变得更容易,因为你可以摆脱Assignment类和表。

您的数据库表“电脑”,然后需要一个student_id数据列,与非唯一索引

你的模型应该是这样的:

class Computer < ActiveRecord::Base 
    belongs_to :student 
end 

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

“依赖废除”因为你不想要在删除学生时删除计算机,而是将其标记为空闲。

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

+0

这实际上似乎是最好的解决方案,它使代码看起来更干净。 – Dan

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

我认为表名应该是computers_students –

+0

是的,你必须遵循类名的词法顺序。 – thesis

+0

你是对的。 – alexkv

0

其实你的方法是好的,正如@alexkv提供的一个。这是更多的讨论,而不是问题。

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

从api.rubyonrails.org:

选择建立一个多一对多的关系哪种方式并不总是 简单。如果您需要使用关系模型作为自己的 实体,请使用has_many:through。当 使用传统模式或者您从不直接与 关系本身一起工作时,请使用has_and_belongs_to_many。

我可以告诉你读这一点,明白了什么办法更好地在您的情况进行选择: