2011-09-17 48 views
0

我的出發點基本上是Ryan Bate的RailsCast。我修改了他的代碼以適應OR子句以及AND。步進或迭代通過BigDecimal

在用戶模型中,有幾個屬性名爲hour_price_high和hour_price_low。用戶將他們的小時費率範圍設置爲45.25美元/小時至55.50美元/小時。網站訪問者將以50.00美元/小時到60.00美元/小時的價格範圍搜索註冊用戶。此搜索應返回所有重疊的用戶。這些屬性的相應遷移的項目有:

# 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 

有關如何通過這些增加任何想法?我只需要增加兩位小數。感謝您的期待!

回答

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方法。當你給這樣的:

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

到的ActiveRecord作爲條件,它可能看到你已經給它一個範圍,並調用它to_a得到的東西,可以是SQL-指明分數而這也正是你的錯誤來自。

我想你要這樣說:

[ "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

你真棒。您的> =和<=推薦使我走上了正確的道路。我需要結合你所說的和BETWEEN。我還需要添加:[「users.hour_price_low <=?AND users.hour_price_high> =?,price_low,price_high]除非price.blank? ... [「users.hour_price_low/high BETWEEN?AND?」,price_low,price_high]除非price.blank?所有的測試都通過了!再次感謝! – mikeborgh