2

repeat_purchases_percent 是我的 Category 模型中的一种方法。所有无父类别都保证在数据库中具有 future_purchases_percent 的值。子类别可能有也可能没有 future_purchases_percent。如果他们这样做,我想使用该值。如果没有,我想使用父母的价值等等。

我尝试了一种递归方法。

def future_purchases_percent
  if self.future_purchases_percent.nil?
    Category.find(self.parent_id).future_purchases_percent
  else
    future_purchases_percent
  end
end

这陷入了一个不断评估的循环中:

if self.future_purchases_percent.nil?

我怎样才能正确地实现这个方法?

4

2 回答 2

5
  1. 您的方法卡住了,因为它与属性具有相同的名称(因此它正在调用自己),请选择不同的名称。
  2. 请注意,这个条件只不过是一个简单的a || b表达式。
  3. 您应该在belongs_to :parent, :foreign_key => 'parent_id', :class_name => :Category此模型中添加一个。

现在,一切就绪,您可以编写真正的声明性代码:

def safe_future_purchases_percent
  future_purchases_percent || parent.safe_future_purchases_percent
end
于 2012-12-05T20:43:43.377 回答
0
  def repeat_purchases_percent
    if self.future_purchases_percent.nil?
      Category.find(self.parent_id).repeat_purchases_percent
    else
      future_purchases_percent
    end
  end

基本上,您的问题是您将方法命名为与字段相同的名称,然后立即调用它。相反,您应该像您所说的那样命名该方法,并且仅在为 nilrepeat_purchases_percent时才递归到该方法中。future_purchases_percent

于 2012-12-05T20:44:25.293 回答