2014-06-26 71 views
0

我有一個House模型,該模型的price屬性使用實例方法計算得出。按實例方法計算的值進行篩選

假設由於市場利率,通貨膨脹等原因,價格不斷變化。因此,我們需要一個price_today方法來獲得當前價格。

如何使用最高價格和最低價格創建指​​定範圍(或某物)來過濾房屋?

我試圖做這樣的事情,但我覺得這是一個有點哈克......

def index 
    @houses = # get houses from DB 

    if not params[:max_price].nil? 
     @houses.keep_if { |h| h.price_today <= params[:max_price].to_f } 
    end 

    if not params[:min_price].nil? 
     @houses.keep_if { |h| h.price_today >= params[:min_price].to_f } 
    end 
    end 

回答

1

命名範圍(或where條款)肯定會更快一些查詢和過濾的實例化對象。
但是,恐怕如果price_today不存在於數據庫中,您將無法使用它們。

但是,您可以改進您的代碼。
條件可以變得更簡單,您可以使用一個電話keep_if

max = params[:max_price].presence 
min = params[:min_price].presence 

if max || min 
    @houses.keep_if do |house| 
    a = max ? (house.price_today <= max.to_f) : true 
    b = min ? (house.price_today >= min.to_f) : true 
    a && b 
    end 
end 

如果你想,而不是keep_if可以使用select

+0

這太複雜了。 – zishe

0

另一個變化:

{ max_price: ->(price, max) { price <= max }, 
    min_price: ->(price, min) { price >= min } }.each { |prop, cond| 
    @houses.select! { |h| cond.(h.price_today, params[prop].to_f) } unless params[prop].nil? 
} 

在拉姆達爲特定屬性的情況下,您可以輕鬆地添加其他條件=)