2011-09-17 7 views
0

私の出発点は、基本的にはRyan BateのRailsCastです。 ORと同様にOR節に対応するようにコードを修正しました。BigDecimalによるステッピングまたは繰り返し

ユーザーモデルには、hour_price_highとhour_price_lowという2つの属性があります。ユーザーは$ 45.25/h〜$ 55.50/hのような毎時のレート範囲を設定します。サイト訪問者は$ 50.00/h〜$ 60.00/hなどの価格帯で登録ユーザーを検索します。この検索で​​は、重複するすべてのユーザーが返されます。これらの属性のそれぞれの移行エントリは次のとおりです。

# CreateUser migration 
... 
t.decimal "hour_price_high", :precision => 6, :scale => 2 
t.decimal "hour_price_low", :precision => 6, :scale => 2 
... 

彼らはBigDecimal型のものであり、私は、ユーザーを検索するには、これらを通じてインクリメントする必要があります。

# Search.rb 
def low_price_or_conditions 
    ["users.hour_price_low IN (?)", price_low..price_high] unless price.blank? 
end 
def high_price_or_conditions 
    ["users.hour_price_high IN (?)", price_low..price_high] unless price.blank? 
end 

私はこのコードを実行すると、私はこのエラーを取得します:

TypeError: 
can't iterate from BigDecimal 

これをどのように増やすかについてのアイデアはありますか?私は小数点以下2桁まで増分するだけです。見てくれてありがとう!

答えて

1

あなたは配列にBigDecimalの範囲を変換することはできません。

> a = BigDecimal.new('1') 
=> #<BigDecimal:12a082bb0,'0.1E1',9(18)> 
> b = BigDecimal.new('5') 
=> #<BigDecimal:12a076ec8,'0.5E1',9(18)> 
> (a..b).to_a 
TypeError: can't iterate from BigDecimal 

fine manualから:

You can only iterate if the start object of the range supports the succ method

とのBigDecimalはsuccメソッドを持っていません。あなたはこのフィード時:条件としてはActiveRecordに

["users.hour_price_low IN (?)", price_low..price_high] 

を、それはおそらくあなたがそれに範囲を与えてくれたことを見て、SQL-ifiedことができる何かを得るためにそれにto_aを呼び出し、自分のエラーがどこから来ているのです。

私はあなたがこれを言いたいと思う:

[ "users.hour_price_low >= :lo AND users.hour_price_low <= :hi", { :lo => price_low, :hi => price_hi } ] 

同様の問題は、あなたのhour_price_highに適用されます。

price_lowprice_highが整数であっても、INを使用したくない場合でも、範囲がかなり大きいリストに拡張され、データベースはそれぞれ個別に比較する必要があります。

+0

あなたは素晴らしいです。あなたの> =と<=推奨は正しい道を私に導きました。私は、あなたが言ったことと自分のものの組み合わせを使う必要があった。 price.blankを除いて、これを追加する必要がありました:["users.hour_price_low <=?AND users.hour_price_high> =?"、price_low、price_high? ... ["users.hour_price_low/high BETWEEN?AND?"、price_low、price_high] price.blankを除く?すべてのテストは合格です!再度、感謝します! – mikeborgh

関連する問題