在rails上正确实现Ruby中的递归方法

k_D*_*ank 2 ruby recursion ruby-on-rails

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
Run Code Online (Sandbox Code Playgroud)

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

if self.future_purchases_percent.nil?
Run Code Online (Sandbox Code Playgroud)

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

tok*_*and 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
Run Code Online (Sandbox Code Playgroud)