Rails:has_many和belongs_to

时间:2014-07-23 08:21:40

标签: ruby-on-rails activerecord ruby-on-rails-4

我的应用中有两个型号:

位置:

class Position < ActiveRecord::Base

  belongs_to :report_to_position, class_name: 'Position', foreign_key: 'report_to_position_id'
  has_many   :employees

end

员工:

class Employee < ActiveRecord::Base

  belongs_to :position

  def boss
    self.position.report_to_position.employee
  end

end

正如您在boss getter中所看到的,我需要在此关系中获得一个employee。问题是Position类有很多employees。如何使用此模型逻辑获得一个对象(许多员工的老板)?

谢谢!

2 个答案:

答案 0 :(得分:1)

您无法通过此关联设置获取 老板,但您可以获得 老板。那就是:你可以得到一个优越的。 Positionhas_many :employees,它会给您带来两个问题:

  1. Employee课程中没有任何内容可以说&#34;这是我的直接上级&#34;。
  2. 整个系统中没有任何内容可以说&#34;只有一个人可以担任职位&#34;。
  3. Position课程中没有任何内容可以说&#34;这个人是老板&#34;。
  4. 那可能没事;如果可以获得给定Employee的(基本上是随机的)上级,那么你的老板方法可以如下所示:

    def boss
      self.position.report_to_position.employees.first
    end
    

    但总的来说,我重新考虑您的架构。将组织结构图和员工数据分开是可以的,但是您应该考虑通过self join将老板/下属关联移到Employee本身:

    class Employee < ActiveRecord::Base
      has_many :subordinates, class_name: "Employee", foreign_key: "boss_id" 
      belongs_to :boss, class_name: "Employee"
      belongs_to :position
    end
    

答案 1 :(得分:1)

<强>结构

为了帮助定义Alex P的答案,您需要了解自己在中定义 {/ 1}}记录的方式。关联和表格。

我能看到的问题是因为你所有的boss关联数据都是一样的,你无法确定谁是&#34;老板&#34;或不,因此你的问题

有两种方法可以确保您定义employee关联 -

  
      
  1. boss协会
  2. 中   
  3. 在数据库/ ActiveRecord
  4. 中   

-

<强>协会

执行此操作的最可靠方法可能是使用Model,如association所述:

Alex P

-

<强>模型

我这样做的方法是使用Ancestry gem -

#app/models/employee.rb
Class Employee < ActiveRecord::Base
   belongs_to :boss, class_name: "Employee"
   has_one :boss, class_name: "Employee", foreign_key: "boss_id"
end

这必须与名为#app/models/employee.rb Class Employee < ActiveRecord::Base has_ancestry end ancestry)的数据表列相结合:

enter image description here

这将允许您为每个string提供(可能是老板或经理等)。这种设置的美妙之处在于你可以创造一个真正的树#34;结构 - 员工将能够根据需要拥有多名经理/老板