3

私はこのようなコードを持っています:

class Item < ActiveRecord::Base
  class << self
    def for_category(c)
      if c
        return where(:category_id => c.id)
      else
        return self
      end
    end
  end
end

私はそれをこのように呼ぶ必要があります:

Item.where("created_at > ?", Time.now - 1.week).for_category(@category)

@categoryはnullの場合とnullでない場合があります。カテゴリがnullの場合、メソッドを単純にパススルーして、関係を変更せずに返すようにします。もちろん、returnselfは単にItemクラスを返します。

これを行う正しい方法は何でしょうか?

4

3 に答える 3

4

さらなるスコープ アクションのために (クラス自体ではなく) スコープを返そうとしていますか? その場合、次のようなものが機能するはずです。

class Item < ActiveRecord::Base
  class << self
    def for_category(c)
      if c
        return where(:category_id => c.id)
      else
        return scoped
      end
    end
  end
end

HTH

于 2013-01-24T12:51:39.597 に答える
1
class Item < ActiveRecord::Base
    def self.for_category(c)
      conditions = {:category_id => c.id}
      conditions.delete_if {|key,val| val.blank? }
      self.where(conditions)
    end
end

あなたのアイテムはカテゴリに関連付けられていますか? Item.where("created_at > ?", Time.now - 1.week).categroiesはいの場合、上記のコードを必要とせずに、すべてのアイテム カテゴリを簡単に取得できます。

于 2013-01-24T12:50:48.663 に答える