2016-01-23 75 views
0

我可以鏈接範圍,像這樣:導軌 - 鏈 '其中' 作用域與OR

scoped = User.where(sex: 'F') 
scoped = scoped.where(color: 'blue') 

ActiveRecord的生成此SQL的第一行:

SELECT COUNT(*) FROM "users" WHERE "users"."sex" = 'F' 

這SQL爲2號線:

SELECT COUNT(*) FROM "users" WHERE "users"."sex" = 'F' AND "users"."color" = 'blue' 

在保持初始查詢,所以它建兩行以上我能怎樣改變從ANDOR所以最終的結果是這樣的:

SELECT COUNT(*) FROM "users" WHERE "users"."sex" = 'F' OR "users"."color" = 'blue' 
+0

同意Logan的回答。嘗試使用squeel或arel來獲得更豐富的語法。我們使用squeel,迄今爲止非常好。 – jlhonora

+0

你能詳細說明你需要在多行建立這個的原因嗎? – jeffdill2

+0

我需要在多行上構建它,因爲我正在迭代'hstore'屬性中的一組鍵,並且對於每個鍵我想查找所有完全缺少鍵的記錄,或者如果它們具有鍵不是'nil'或''「''。這是一個循環。然後我想用'OR'子句來擴展它,以選擇hstore屬性本身爲'nil'的所有記錄。 – Meltemi

回答

0

如果使用squeel寶石,你可以這樣實現:

User.where(
    { sex: 'F' } | 
    { color: 'blue' } 
) 

然而,因爲它聽起來像你需要動態地構建查詢,我建議你做這樣的事情:

queries = [ 
    "sex = 'F'", 
    "color = 'blue'" 
] 

User.where(queries.join(" OR ")) 

使用這種方法,您可以根據需要將queries陣列動態添加儘可能多的查詢。顯然,你必須在原始SQL中編寫查詢,但這是我意識到用ActiveRecord完成此項工作的唯一選擇。