Ruby on rails 如何逐行递增地构建ActiveRecord查询?

Ruby on rails 如何逐行递增地构建ActiveRecord查询?,ruby-on-rails,ruby,ruby-on-rails-3,activerecord,arel,Ruby On Rails,Ruby,Ruby On Rails 3,Activerecord,Arel,我想使用运行时数据拼凑一个ActiveRecord查询。我想的是 r = Person.where('last_name LIKE ?', foo) r.where('created_at < ?', Time.now - 100.days) r.where( ...some other conditions... ) r=Person.where('last_name LIKE?',foo) r、 其中('创建时间

我想使用运行时数据拼凑一个ActiveRecord查询。我想的是

r = Person.where('last_name LIKE ?', foo)
r.where('created_at < ?', Time.now - 100.days)
r.where( ...some other conditions... )
r=Person.where('last_name LIKE?',foo)
r、 其中('创建时间<?',Time.now-100.天)
r、 其中(…一些其他条件…)
但这并没有达到预期效果。要想让它发挥作用,你必须把它们连在一条线上

Person.where('last_name LIKE ?', foo) \
  .where('created_at < ?', Time.now - 100.days) \
  .where( ...some other conditions... )
Person.where('last_name LIKE?',foo)\
.where('创建时间<?',Time.now-100.天)\
.其中(…某些其他条件…)
我正试图找出一种方法,将其分散到多行上的单独操作中。

方法(如
。where
)返回一个新对象。所以你必须坚持下去。见:

r = Person.where('last_name LIKE ?', foo)
r = r.where('created_at < ?', Time.now - 100.days)
r = r.where( ...some other conditions... )
r=Person.where('last_name LIKE?',foo)
r=r.where('创建时间<?',Time.now-100.天)
r=r,其中(…一些其他条件…)

令人沮丧的是,当您调用对象的方法时,Arel没有改变对象或底层查询。但是每个方法都返回Arel对象,这允许链接。你必须做到:

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

等等,等等。

我把它当作一个特性而不是一个bug:)它感觉和它应该表现的不一样。但也许那只是我。我曾经遇到过这样的问题:调用arel方法后,我意外地忘记了重新分配变量,并且没有得到预期的结果。所以我称之为令人沮丧:它很可能会支持一个用于突变的bang变体,即
r.where!'已在…'处创建。\u