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 に答える