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

时间:2012-12-05 20:40:35

标签: ruby-on-rails ruby recursion

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?

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

2 个答案:

答案 0 :(得分:5)

  1. 你的方法被卡住了,因为它的名字与属性相同(所以它自己调用),选择一个不同的名字。
  2. 请注意,此条件只不过是一个简单的a || b表达式。
  3. 您应该为此模型添加belongs_to :parent, :foreign_key => 'parent_id', :class_name => :Category
  4. 现在,一切就绪后,您可以编写真正的声明性代码:

    def safe_future_purchases_percent
      future_purchases_percent || parent.safe_future_purchases_percent
    end
    

答案 1 :(得分: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

基本上你的问题是你的方法命名方法与字段相同,然后立即调用它。你应该像你说repeat_purchases_percent那样命名方法,并且只在future_purchases_percent为零时才递归到它。