2012-04-13 10 views
5

ランタイムデータを使用してActiveRecordクエリをまとめたいと思います。私が気にしていることは、次のようなものです...ActiveRecordクエリを段階的に1行ずつ作成するにはどうすればよいですか?

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

これは意図したとおりに動作しません。 ...それはあなたがすべて1行にそれらを一緒に連鎖する必要が動作するように

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

私は機能ではなく、バグとしてそれを扱う:) –

+1

それは*どのように振る舞うべきそして*異なる感じています。しかし、多分それは私だけです。前に問題を抱えていました。私は、誤ってarelメソッドを呼び出した後に変数を再割り当てするのを忘れてしまい、期待した結果が得られませんでした。だから...私はそれをイライラしています:p – nzifnab

+0

理想的には、突然変異のためのバングの変種、すなわち 'r.where! 'created_at ...' ' – mahemoff

関連する問題