2014-09-04 42 views
0

我有一個循環,它碰到了一對範圍,然後將結果推送到一個數組中。我遇到的問題是如果沒有記錄匹配範圍,它仍然會返回一個ActiveRecord :: AssociationRelation []。我如何過濾這些,所以我沒有讓他們在我的陣列?只有當範圍返回記錄時纔將對象推入數組,而不是空白

實施例:

class Snack 
    belongs_to :member 

    scope :red, -> { where(color: 'red') } 
    scope :snacktypefind, -> (snacktypefind) { where(snacktype: snacktypefind) } 
end 

class Member 
    has_many :snacks 

def find_snacks(snacktypes) 
    returnarray = [] 
    snacktypes.each do |snacktype| 
     returnarray << self.snacks.red.snacktypefind(snacktype) 
    end 
    return returnarray 
end 

end 

然後,在圖說我希望:

<% @member.find_snacks(['bannana','orange']).each do |snack| %> 
    <li>snack.name</li> 
<% end %> 

在上述情況下,我想在陣列爲[]但相反,它是:

[#<ActiveRecord::AssociationRelation []>, #<ActiveRecord::AssociationRelation []>] 

這次我做錯了什麼傻事?再次感謝您的幫助!

+0

如果'.length> 0',爲什麼不推送它們? – 2014-09-04 19:05:38

+0

我嘗試過,並且由於沒有長度函數而導致記錄返回時出錯。但我可能做錯了。 – MechDog 2014-09-04 19:07:54

+1

你可以嘗試'count'。你是否試圖將'concat'值實際應用到數組上,或者維護一個具有值的作用域數組,或者......? – 2014-09-04 19:10:24

回答

1

哇你使它方式與額外的代碼更容易這個怎麼樣

class Member 
    has_many :snacks 

    def find_snacks(snacktypes) 
    snacks.red.snacktypefind(snacktypes) 
    end 

end 

這變成

"SELECT snacks.* FROM snacks WHERE snacks.member_id = YOUR_MEMBER_ID AND snacks.color = 'red' AND snacks.snacktype IN (YOUR snacktypes array)" 

目前您的實現,我們將其稱爲「查詢,並推」有缺點。

首先,這將創建多個微型集合,可能由單個對象組成。這將是迭代的地獄,因爲你將不得不迭代實際訪問對象。 其次,這將爲每個snacktype創建多個查詢1,這會降低性能。

你真正想要的是鏈式查詢方法將範圍縮小到只包含你需要的元素的單個ActiveRecord::Relation。這將執行一個單一的查詢,當你迭代管道對象將是你想訪問的實際對象,而不是另一個ActiveRecord::Relation,這將不得不重複。

ActiveRecord Query Methods關於作用域和查詢鏈的重要部分是它們在鏈完成之前不會被執行,允許您以非常精細的方式輕鬆添加和刪除條件。通過這種方式,您可以明確地將數據定位到數據庫中,而不是將其加載到內存中並從那裏清除它。

+0

10快餐類型如何得到可變小吃類型?軌道是否採用複數形式並迭代它們?總是令人驚歎的一些事情!沒關係,我錯過了更正。對於那個很抱歉。現在嘗試使用*(splat)運算符 – MechDog 2014-09-04 19:49:16

+0

,它將使用這個'('banana','orange')''的參數,並在傳遞給它時使它們成爲數組'''banana','orange']'查詢方法'where'作爲'Hash'。例如'在哪裏(snacktype:['banana','orange'])'它看到這是一個'Array'並創建了一個'IN'語句而不是'='語句。 – engineersmnky 2014-09-04 19:52:04

+0

我更正了代碼,它應該是一個數組進入。感謝您的信息!我已經嘗試過了,並且我似乎還是會回到#,有時我會將某些鏈接在一起。我會仔細檢查。恥辱他們沒有辦法擺脫#而不是所有這些箍跳。 – MechDog 2014-09-04 20:01:12

0

我落得這樣做:

def find_snacks(snacktypes) 
    returnarray = self.snacks.none 

    snacktypes.each do |snacktype| 
    returnarray += self.snacks.red.snacktypefind(snacktype) 
end 
return returnarray 
end 

僅適用於因.none軌道4,但我沒有軌道3個項目,所以我想這是好的。

相關問題