2012-03-30 15 views
1

我使用Rails 3的MySQL數據庫,我需要以編程方式創建這樣的查詢:使用ActiveRecord執行OR子句查詢的「Rails方式」是什麼?

select * from table where category_name like '%category_name_1%' 
OR category_name like '%category_name_2%' 
(...snip...) 
OR category_name like '%category_name_n%' 

鑑於表規模和項目範圍(最多500行,我認爲),我覺得使用思維獅身人面像這樣的東西會過度殺傷。 我知道我可以直接通過編寫查詢字符串來做到這一點,但想知道是否有ActiveRecord的方式來做到這一點。在official guide上沒有提到這一點,我一直在谷歌搜索了很長一段時間,只是爲了結束空手:(

此外,是否有一個原因(也許是一個Rails的原因?)不包括在內or子句

感謝

+0

我不確定你的意思是你選擇的指南中沒有提及。 2.2節包含一個非常相似的例子(用'和'代替'或'和'='代替'like')。 – 2012-03-30 20:20:16

+0

這是正確的,但請看看我對以下評論的回覆...... – Ramses 2012-03-30 21:18:56

回答

7

假設你有一個數組names與類別名稱:

Model.where(names.map{"category_name LIKE ?"}.join(" OR "), 
    *names.map{|n| "%#{n}%" }) 
+0

這工作像一個魅力。只需對您的示例稍作修改即可:'Model.where(names.map {「category_name LIKE?」}。join(「OR」),* names.map {| n |「%#{n}%」})'' ...「n」周圍的#{}缺失 – Ramses 2012-03-30 21:32:09

1

如果你看一下指導,他們可以很容易地修改,以這樣的例子:?!

Client.where("orders_count = ? OR locked = ?", params[:orders], false) 
+0

如果您想在某些條件後添加另一個OR子句,該怎麼辦?例如,除了orders_count和locked之外,您還想添加諸如'OR id_number =?' – Ramses 2012-03-30 21:21:50

+0

Client.where(「orders_count =?OR locked =?OR id_number =?」,params [:orders],false,id )(?????) – 2012-03-30 21:30:37

+0

我的意思是如何以編程方式添加第三個(或第四個)OR,而不僅僅是改變查詢字符串... – Ramses 2012-03-30 21:40:49

4

你應該谷歌第一,已經有一個答案。 看here然後here ,你會得到這樣的事情:

accounts = Account.arel_table 
Account.where(accounts[:name].matches("%#{user_name}%").or(accounts[:name].matches("%#{user_name2}%"))) 
1

MySQL有一個正則表達式的功能,現在可以清理了一點東西,假設有一個在你的類別名稱沒有正則表達式metachars:

Table.where "category_name regexp '#{names.join('|')}'" 
相關問題