2012-04-13 73 views
5

我想拼湊使用運行時數據的ActiveRecord查詢。我想到的是類似的東西...如何逐行建立ActiveRecord查詢?

r = Person.where('last_name LIKE ?', foo) 
r.where('created_at < ?', Time.now - 100.days) 
r.where(...some other conditions...) 

這並不按預期工作。爲了得到它的工作,你必須鏈在一起都在一行...

Person.where('last_name LIKE ?', foo) \ 
    .where('created_at < ?', Time.now - 100.days) \ 
    .where(...some other conditions...) 

我試圖找出一種方法來在多條線路上獨立的操作傳播它。

回答

17

Query Interface方法(如.where)返回一個新的對象。所以你只需要堅持下去。請參閱:

r = Person.where('last_name LIKE ?', foo) 
r = r.where('created_at < ?', Time.now - 100.days) 
r = r.where(...some other conditions...) 
2

當您調用其方法時,Arel令人沮喪地不會改變對象或基礎查詢。但是每個方法都會返回Arel對象,這允許鏈接。你要做的:

r = Person.where(... 
r = r.where('created_at...') 

等等等等

+3

我把它作爲一個功能,而不是一個bug :) – 2012-04-13 23:24:22

+1

它* *的感覺不同的那麼怎麼它應該表現。但也許這只是我。在我調用一個arel方法後,我不小心忘記重新分配變量,並且沒有獲得我期望的結果之前,我遇到了問題。所以......我稱之爲令人沮喪:p – nzifnab 2012-04-13 23:27:16

+0

理想情況下,它會支持變異的爆炸變體,即'r.where! 'created_at ...'' – mahemoff 2015-09-23 03:16:18