9

即使它正常工作,我也对它如何工作感到有些困惑。我有一个模型与同一个模型有两个关联。

公司有一个老板,公司有很多员工的类用户。

这是我的公司模型:

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) 添加到员工列表中。这三个都将他们的 company_id 设置为我们可以假设为 1 的公司 ID

当我询问 company.owner 时,我得到了正确的用户,当我询问 company.employee 时,我得到了所有三个。

如果我将所有者更改为用户 2,它会通过将其 company_id 设置为 nil 来自动从员工中删除用户 1。这很好,如果我将他添加为简单的员工,一切仍然很好。

rails 怎么知道哪个是哪个?我的意思是它如何知道员工是所有者而不仅仅是员工?架构中的任何内容都没有定义这一点。

我有一种感觉我应该扭转所有者关联并使公司属于用户。

4

3 回答 3

12

正如你现在所拥有的,没有什么可以区分所有者和员工。这意味着一旦您开始移除人员或尝试更改所有权,您就会遇到问题。

正如弗朗索瓦指出的那样,您很幸运,所有者是属于具有最低 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

您必须在 Companies 表中添加另一个名为 owner_id 的列,但这更清楚地定义了您的关系。并且将避免与更改所有者相关的任何麻烦。请注意,如果您走这条路线并设置数据库以使 users.company_id 和 Companies.owner_id 都不能为空,则可能存在周期性依赖关系。

我不太确定accepted_nested_attributes_for 将如何处理belongs_to 关系。

于 2009-10-10T02:37:13.967 回答
5

has_one 是语法糖:

has_many :whatevers, :limit => 1

有一个添加:limit => 1位,从而确保只返回 1 条记录。在你有一个声明中,确保你有一个:order条款,在所有情况下都返回正确的记录。在这种情况下,我会在 Employee 上放置一个标志来表示谁是所有者,并按此列排序以获得正确的记录 1st。

您关于 Rails 为何知道这一点的问题是因为大多数数据库将按主键顺序返回记录。因此,第一个添加的员工的 ID 为 1,因此将返回第一个。

于 2009-09-26T17:18:44.820 回答
0

您可以有一个称为所有权的模型-

ownership belongs_to company   
ownership belongs_to user

user has_many ownerships
company has_one ownership
于 2009-09-26T07:44:02.507 回答