2016-03-10 29 views
0

比方說,我有像記錄的列表:如何在Ruby中使用多個#select塊?

transactions = Transaction.all 

而且我有以下的實例方法@currency, @geo, @industry。我想選擇記錄它具有以下標準:

  • 選擇具有場currency相等於@currency除非@currency是零,在這種情況下,我們會忽略條件的所有交易(貨幣將意味着,當所有貨幣它爲零)

  • 選擇所有具有字段geo的交易,其等於@geo,除非@geo爲零。

  • 選擇所有具有字段industry的交易,其等於@industry除非@industry爲零。

我試過多次#select但沒有運氣是這樣的:

transactions.select{ |i| (i.currency == @currency) unless @currency.nil? }. 
     .select{ |i| (i.geo == @geo) unless @geo.nil? }. 
     .select{ |i| (i.industry == @industry) unless @industry.nil? } 
+0

不會像'Transaction.where(貨幣:@currency,geo:@geo,industry:@industry)''也許'除非[@currency,@geo,@industry] .compact.empty?'足夠嗎? – wpp

+0

@wpp我將如何使用它與數組而不是SQL。如果存在,我將如何應用每個查詢,而不是全部存在。在情況'除非[@currency,@geo,@industry] .compact.empty?'這意味着它會運行,除非所有的值都是空的,但在我的情況下,我想檢查每個如果空或不 –

回答

1
transactions.select do |t| 
    (@currency.nil? || t.currency == @currency) && 
    (@geo.nil? || t.geo == @geo) && 
    (@industry.nil? || t.industry == @industry) 
end 

本應該做的工作。

或者,如果你到動態:

[:currency, :geo, :industry].all? do |field| 
    (ivar = instance_variable_get("@#{field}")).nil? || t.send(field) == ivar 
end 
+0

'instance_variable_get(「#{field}」)'無效,使用'instance_variable_get(「@#{field}」)''。 –

1

使用AR/SQL,而不是紅寶石加工時可能:

transactions.where(currency: @currency, geo: @geo, industry: @industry) 
+0

謝謝你願意幫助,但在我的情況下,我想在一個數組中使用它。我以交易爲例進行說明,我只是想用'select'或'map'來完成這項工作,如果值不是零,我該怎麼做? –

+0

如果'@ currency'爲零,那麼整個表達式爲零,所以我不認爲這是有效的。還內聯'if's看起來有點奇怪在複雜布爾表達式 –

2

你的榜樣的問題是unless @currency.nil?將返回nil(這是falsey)如果@currencynil,這是您的本意相反。

您應該使用||代替:

transactions.select{ |i| (i.currency == @currency) || @currency.nil? }. 
     select{ |i| (i.geo == @geo) || @geo.nil? }. 
     select{ |i| (i.industry == @industry) || @industry.nil? } 

在這種情況下,如果@currencynil,第一個條件將返回true,和所有的元素將通過select框下一個...

另一種選擇是運行select只有是參數不是nil。在這種情況下,您希望將行分成單獨的塊:

transactions.select!{ |i| (i.currency == @currency) } unless @currency.nil? 
transactions.select!{ |i| (i.geo == @geo) } unless @geo.nil? 
transactions.select!{ |i| (i.industry == @industry) } unless @industry.nil? 
相關問題