2011-01-04 10 views
0

私は現在、いくつかのスコープフィルタを扱っています。メソッドにフィルタをかけたいのですが(別の方法で名前を付ける方法はわかりません)。私のコード:スコープをModelメソッドと組み合わせて使用​​する方法は?

class Product < ActiveRecord::Base 
    def price_with_discount 
    price-discount.to_f 
    end 

    scope :by_price, lambda {|min,max|{ :conditions => { :price_with_discount => min.to_f..max.to_f }}} 
end 

これは動作しません:「price_with_discountという名前の属性がテーブルproductsのために存在しません」。 price_with_discountという名前の列を検索する代わりに、私が定義した方法を使用して範囲を欺くことができますか?

ビヨーン

答えて

2

でない場合、それは作品だと仮定します。これは、排他的スコープのものではありません、それはすべてのActiveRecordクエリに適用されます。

# This won't work either 
Product.where(:price_with_discount => min.to_f) 

この理由は、何のActiveRecordが必要とするデータベースフィールドに「翻訳」することができるものであるということです。記号:price_with_discountは、データベースに変換することはできません。

さらに、レール3の場合はyou don't really need scopes any moreです。通常のクラスメソッドは同じことを行い、書き込むのが簡単です(lambdaはありません)。

class Product < ActiveRecord::Base 
    def self.by_price(min, max) 
    # Assuming that products.discount is a database field: 
    where([ "(products.price - products.discount) >= ? AND " + 
      "(products.price - products.discount) <= ?", 
      min, max 
    ]) 
    end 
end 
+0

私のコードをあなたの例のように調整しました。私はRails 3であり、完全に動作します。 – Bjorn

0

私たちのRubyメソッドではSQL制限を行えません。それを使用しないでください、私はあなたの価格の割引はあなたが:conditions内ルビー・メソッドを使用することはできません文字列

scope :by_price, lambda {|min,max|{ :conditions => { :price-discount => min.to_f..max.to_f }}} 
関連する問題