加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 23:00:49 所属栏目:百科 来源:网络整理
导读:我有点困惑,即使它的工作正常,这个工作.我有一个模型与另一个模型有两个关联. 公司拥有一名业主和公司,有许多班级用户的员工. 这是我公司的型号: class Company ActiveRecord::Base validates_presence_of :name has_many :employee,:class_name = 'User' h
我有点困惑,即使它的工作正常,这个工作.我有一个模型与另一个模型有两个关联.

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

这是我公司的型号:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读