我有点困惑,即使它的工作正常,这个工作.我有一个模型与另一个模型有两个关联.
公司拥有一名业主和公司,有许多班级用户的员工.
这是我公司的型号:
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的员工,并通过设置其company_id(user.company = company)将另外两个(2,3)添加到员工列表中.所有这三个人的company_id设置为我们可以假设为1的公司ID
当我要求company.owner,我得到正确的用户,当我做company.employee,我得到所有三个.
如果我将所有者更改为用户2,则通过将用户1的company_id设置为nil来自动删除员工1.这很好,如果我把他添加为一个简单的员工,所有的都还是不错的.
如何知道哪个是哪个?我的意思是它是如何知道一个雇员是业主,而不只是一个雇员?模式中没有任何内容定义了这一点.
我有一种感觉,我应该扭转业主协会,使公司属于用户.
解决方法
如现在所有,没有什么可区分所有者和员工.这意味着一旦您开始删除人员或尝试更改所有权,您将遇到问题.
正如François指出的那样,你只是幸运的是,所有者是属于ID最低的公司的用户.
为了解决这个问题,我将在下面的maner中介绍我的模型.
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 belongs_to :company has_one :company,:foreign_key => :owner_id end
您必须在“公司”表中添加名为owner_id的另一列,但这更清楚地定义了您的关系.并且将避免与更改所有者相关的任何麻烦.请注意,如果您进入此路由并且将数据库设置为使得users.company_id和company.owner_id不能为空,那么可能会有循环依赖.
我不太确定accept_nested_attributes_for将如何与belongs_to关系发挥作用.