2009-07-21 19 views
1

検索フォームから提出された動的な価格帯を選択する必要があります。どのように私はスコープでこれにアプローチすべきですか?私はこのRails、named_scopeで作業する

Painting.price_range([ '1..500'、 '2000..5000'])

SELECT * FROM paintings WHERE price BETWEEN 1..500 **OR** BETWEEN 2000..5000 etc. 

敬具のようなものを探しています。 AsbjørnMorell。

答えて

2

あなたはnamed_scopeにラムダを使用する必要があります。以下は動作するはずです:

named_scope :price_range, lambda { |ranges| 
    { 
     :conditions => ["(" + 
     ranges.collect {"price between ? and ?"}.join(" or ") + 
         ")"] + 
     ranges.collect {|r| [r.min, r.max]}.flatten 
    } 
    } 

をあなたは範囲を持っているとして、最初のranges.collectは、できるだけ多く「between ? and ?」のチェックを作成した後、第2 ranges.collectは範囲を平らにし、条件に消毒するための値として追加します。私は、安全な側になるためには、orsの周りに角括弧を貼り付けました。

+0

非常に良い! Painting.price_range([['1'、 '200']、['1000'、 '2000']]) ペインティング負荷(0.4ms)SELECT * FROM 'paintings' WHERE((price '1'と '200'の間、または '1000'と '2000'の間の価格) 私はそのような金のプレートに解決策を渡してくれてありがとう:) – atmorell

+0

私はスコープを形式: これで生成されたクエリは、 です。SELECT * FROM 'pai(=>"変更を保存 "、"検索 "=> {" price_range "=>" [[1,1000] 私は、フォームからの値が配列として認識されないという問題があると考えています://[[1、1000]]と[[[1,1000] params [search] [price_range] .classはarrayではなくstringを返します。 提案がありますか? – atmorell

+0

ええ、答えの解は、ペアの配列ではなく、一連の範囲の解です。 r.firstとr.lastのためにr.minとr.maxを変更すると、それもペアのために働くはずです。 – Shadwell

4
named_scope :price_range, :conditions => ["(price BETWEEN 1 AND 500) OR (price BETWEEN 2000 AND 5000)"] 

OR

named_scope :price_range, :conditions => ["(price ?) OR (price ?)", (1..500).to_s(:db), (2000..5000).to_s(:db)] 

ダイナミック

named_scope :price_between, lambda { |from, to| { :conditions => ['price > ? AND price <= ?', from, to] } } 

named_scope :price_between, lambda { |from, to| { :conditions => ['price BETWEEN ? AND ?', from, to] } } 

- >

MyModel.price_between(1,100) 
関連する問題