2012-09-11 53 views
0

例如,我想結合兩個數組,並添加where子句像這樣:Ruby on Rails:你如何結合兩個數組並使用「where」方法?

(Recipe.current + Recipe.previous)。凡(:名稱=> 「ABC」)

我知道你可以將它合併成一個(Recipe.where(「current is true or previous is true」)),但我有一些複雜的查詢迫使我以上述方式組合數組。

可能嗎?

+0

「當前」和「前一個」作用域?我以爲你可以鏈接範圍。 –

+0

你想讓結果數組包含組合的數組,還是聯合或數組? (會在答案上有所不同) – JasCav

+0

我使用「當前」和「前一個」來區分不同的集合。對困惑感到抱歉。我知道你可以鏈接範圍,但我期望先結合兩個數組,然後才能夠使用「where」方法。 – sjsc

回答

3

答案取決於您想要運行多少個數據庫查詢來獲取信息。

如果它的好有2個數據庫查詢,你可以做這樣的事情:

rel  = Recipe.where(:name => "ABC") 
recipes = rel.current | rel.previous 

如果你想擁有這一切在1個數據庫查詢,你有你的關係到使用OR條款,除非您想超越常規ActiveRecord方法並使用Arel或查詢生成寶石之一。

+0

這是完美的!非常感謝你Cypher :) – sjsc

1

我想你想在Rails中做一個複雜的單個SQL查詢來存檔你的目標? 如果你可以在普通的SQL查詢中做到這一點,通常可以在Rails中使用。

構建自定義的SQL查詢字符串可能是另一種解決方案。

另一種方法是組合這些數組並使用Ruby的「拒絕!」要刪除與您的模式不匹配的元素,可能會出現一些性能問題。

1

您的模型的.current.previous看起來像是返回ActiveRecord::Relation對象的範圍。對於這些對象,方法.where可用,但是當您組合這些對象時,它將返回一個Array。陣列沒有.where。因此,您必須在組合之前傳遞該查詢或清除查詢混亂。如果你選擇第二,我會強烈推薦Squeel寶石。

+0

太棒了。感謝Alexandre的推薦 – sjsc