我正在尝试使用我的模型"效果指标"的父母和孩子的列表,在我的模型中,我为父母/孩子提供了这个:
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
答案 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