ruby-on-rails – has_one和has_many在同一模型.轨道如何跟踪?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – has_one和has_many在同一模型.轨道如何跟踪?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有点困惑,即使它的工作正常,这个工作.我有一个模型与另一个模型有两个关联.

公司拥有一名业主和公司,有许多班级用户的员工.

这是我公司的型号:

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关系发挥作用.

猜你在找的Ruby相关文章