我有点困惑,即使它的工作原理如何正常工作。 我有两个联想到同其他模型的模型。
公司拥有的所有者,公司拥有一流的用户的许多员工。
这里是我公司的模式:
class Company < ActiveRecord::Base
validates_presence_of :name
has_many :employee, :class_name => 'User'
has_one :owner, :class_name => 'User'
accepts_nested_attributes_for :owner, :allow_destroy => true
end
这里是我的用户模型:
class User < ActiveRecord::Base
include Clearance::User
attr_accessible :lastname, :firstname #other attr are whitelisted in clearance gem
validates_presence_of :lastname, :firstname
belongs_to :company
end
现在假设我有3个员工的这家公司,包括业主的。 当我第一次创造了公司我的主人设置为ID为1的员工和另外两个(2,3),通过设置自己的company_id(user.company =公司)加入到员工列表。 所有这三个有自己的company_id设置为公司ID,我们可以假定为1
当我问company.owner,我得到了正确的用户,当我做company.employee,我得到的所有三个。
如果我改变了所有者用户2,它通过设置它的company_id为零自动删除用户1从员工。 这是好的,如果我回加他,作为一个简单的员工都还是不错的。
如何赫克没有轨道知道哪个是哪个? 我的意思是它如何知道员工是主人,而不仅仅是雇员? 在该模式中没有定义此。
我有一种感觉,我应该扭转所有者协会,使公司belong_to用户。
正如你现在拥有它,就没有什么可从员工区分所有者。 这意味着你要一旦你开始删除个人或试图改变所有权遇到的问题。
由于弗朗索瓦指出,你只是在主人勒金出是属于公司具有最低ID的用户。
要解决我有问题我的模型在以下满耳有关。
class Company < ActiveRecord::Base
belongs_to :owner, :class_name => "user"
has_many :employees, :class_name => "user"
validates_presence_of :name
accepts_nested_attributes_for :owner, :allow_destroy => true
end
class User < ActiveRecord::Base
include Clearance::User
attr_accessible :lastname, :firstname #other attr are whitelisted in clearance gem
validates_presence_of :lastname, :firstname
belongs_to :company
has_one :company, :foreign_key => :owner_id
end
你必须添加一个名为owner_id到公司表的另一列,但这更清楚地定义你的人际关系。 而且会避免与所有者更改相关的任何麻烦。 需注意的是,如果你走这条路线,让您的数据库中设置这样既users.company_id和companies.owner_id不能为null,有可能是一个周期性的依赖。
我不太清楚如何accepts_nested_attributes_for将与belongs_to的关系发挥。
HAS_ONE是语法糖:
has_many :whatevers, :limit => 1
有一个添加了:limit => 1
位,从而确保只有1个记录被不断返回。 在你有一个声明,要确保你有一个:order
条款,在所有情况下返回正确的记录。 在这种情况下,我把对员工的一个标志来表示谁是主人,并通过该列进行排序,以获得正确的记录1。
你如何来的问题Rails的知道,这是因为大多数数据库将在其主键顺序返回记录。 所以,第一个加入的员工具有ID 1,从而将返回1。
你可以有一个模式叫所有权 -
ownership belongs_to company
ownership belongs_to user
user has_many ownerships
company has_one ownership
文章来源: has_one and has_many in same model. How does rails track them?