2010-08-12 26 views
3

我有一個名爲translations的表。 (和相應的ActiveRecord類)。 此表包含以下字段 ID,key和valueRails3和Arel選擇使用IN和子選擇

我想選擇其中關鍵的一個給定的查詢+所有不符合查詢條件的翻譯匹配所有翻譯,但共享一個翻譯的關鍵它與查詢匹配。

產生的SQL可能看起來是這樣的:

SELECT * FROM TRANSLATIONS where key in 
    (select key from Translations where value like '%some search%') 

我已經嘗試了一些東西,但我似乎無法弄清楚。 關於如何在Arel中表達這一點的任何想法?

回答

3

像這樣的東西應該工作:

t = Table(:translations) 
c = t.where(t[:value].matches('%some search%')).project(:key) 
t.where(t[:key].in(c)) 
+0

嗨感謝您的回答。 這段代碼確實生成了一個看起來應該做這件事的sql語句,但是mysql在語法上抱怨錯誤。 它呈現如下: SELECT'translations'。* FROM'translations' WHERE('translates'.'key' IN (SELECT key FROM'translations' WHERE'translations'.'value' LIKE'%value1%') ) 雖然它應該呈現: SELECT'translations'。* FROM'translations' WHERE('translates'.'key' IN (SELECT'translations'.'key' FROM'translations' WHERE'translations'.'value 'LIKE'%value1%')) 有什麼辦法可以控制這個嗎? – 2010-08-18 18:43:14

+1

使用項目(:'translations.key') – valodzka 2010-08-18 23:34:10

3

類似@valodzka,但增加了 「T [...]」 圍繞:按鍵符號

t = Table(:translations) 
c = t.where(t[:value].matches('%some search%')).project(t[:key]) 
t.where(t[:key].in(c))