Ruby:父子关联只返回"对象"

时间:2016-06-24 16:59:55

标签: ruby-on-rails ruby

我正在尝试使用我的模型"效果指标"的父母和孩子的列表,在我的模型中,我为父母/孩子提供了这个:

  belongs_to :parent, class_name: "PerformanceIndicator", :foreign_key => 'parent_id2'
  has_many :children, class_name: "PerformanceIndicator", :foreign_key => 'parent_id2'

在我的绩效指标表中,我有列parent_id2:t.integer "parent_id2"

但是,如果我尝试像这样呼叫父母,例如:PerformanceIndicator.parent,则返回&#34;对象&#34;,如果我尝试为孩子们说#<NoMethodError: undefined method children' for

我做错了什么?

我想列出这样的绩效指标:

Parent1
  Children1
  Children2
Parent2
  Children1

编辑:

这是我的绩效指标模型:

class PerformanceIndicator < ActiveRecord::Base
  has_many :improvement_actions
  has_ancestry

  belongs_to :parent, class_name: "PerformanceIndicator"#, :foreign_key => :parent_id2
  has_many :children, class_name: "PerformanceIndicator", :foreign_key => 'parent_id2'

  scope :parents, -> { where('parent_id2=''') }


  def self.search(search)
    where("name iLIKE ? OR description iLIKE ?", "%#{search}%", "%#{search}%")


    # where("description LIKE ?", "%#{search}%")
  end


end

2 个答案:

答案 0 :(得分:0)

我认为您应该考虑更改术语。子父关系通常推断从父类继承的子类。

  

但是,如果我尝试像这样调用父节点:PerformanceIndicator.parent,它返回“对象”,如果我为孩子们尝试,它会说#

这种情况正在发生,因为您实际上正在调用类parent上的类方法PerformanceIndicator,该方法继承自Object。因此,PerformanceIndicator的父类是Object。您的类没有类方法children,因为它不存在。你在课堂上定义的是一种实例方法。

您必须拥有类的实例才能调用这些方法。您可以像这样实例化此对象的新实例:

pi = PerformanceIndicator.new
pi.parent
pi.children

答案 1 :(得分:0)

模型的关联始终是每个实例。

因此,您无法访问PerformanceIndicator.parent,因为它是对模型本身的调用,而不是实例。

要创建正确的关联,您必须创建不同的实例,例如:

indi1 = PerformanceIndicator.create
indi2 = PerformanceIndicator.create(parent: indi1)

现在你可以像

那样访问它们了
indi1.children # => ActiveRecord::Relation
indi1.children.to_a # => [<PerformanceIndicator: id: 2, ....>]

indi2.parent  # => <PerformanceIndicator: id: 1>  alias indi1

如果您已经有parent_id,那么您应该带走parent_id2并更改关系,如下所示:

 belongs_to :parent, class_name: "PerformanceIndicator"
 has_many :children, class_name: "PerformanceIndicator", :foreign_key => 'parent_id'

之后,您可以创建父范围:

scope :parents, -> { where(parent_id: nil) }

你可以迭代它们:

PerformanceIndicator.parents.each do |parent|
  # do stuff with parent
  parent.children.each do |child|
    # do stuff with child
  end
end