Rails ActiveRecord:动态构建查询

jay*_*del 24 activerecord ruby-on-rails ruby-on-rails-3

我正在尝试组合一系列可以使用ActiveRecord动态创建和执行复杂查询的类.我对整个做法感到非常满意:

MyModel.select("id, name, floober").join(:creator).where(:is_active => true)
Run Code Online (Sandbox Code Playgroud)

我正在努力的是使用这些东西建立一个查询,无法提前确定每种可能的方法(连接数,数量或where子句,限制,组等)的数量.我可能有2个连接,或者没有连接,具体取决于它的调用位置.

由于我如何得到这些东西的性质 - 连接列表,列列表,where子句列表等 - 我可以盲目地将它们链接在一起.我必须将列连接在一起,排列连接,链接where子句,所以我无法遍历各种列表.

我试图避免编写任何原始SQL.

我试过的一件事是将ruby语句作为一个字符串构建,然后在最后评估它,当我完成后,我感到很脏,就像我需要洗澡一样.我正在寻找的是一种缓存查询状态的方法,直到所有部分都已累积,然后执行它们.

我是否"走出Rails"?

提前致谢...

jay*_*del 56

我想我明白了.基于我对AR查询方法的理解,我完全不合适.事实证明,在您实际尝试使用结果之前,ActiveRecord实际上并不执行查询.因此,可以执行以下操作:

model_query = MyModel.select("column12, column32")
model_query = model_query.joins(:user)
model_query = model_query.where(:column12 => true)
Run Code Online (Sandbox Code Playgroud)

一切都建成后你就可以做到

model_query.each do |record|
  ...
end
Run Code Online (Sandbox Code Playgroud)

在您调用每个(或您使用的任何需要查询结果的方法)之前,查询实际上不会执行.

我通过观看Railscasts 202215得到了这个.我喜欢Ryan Bates.

  • 那些说它对他们不起作用的人......你是否试图在rails控制台中尝试这个?在3.x中,rails控制台通常会对AR进行强制解释,因为它使用某种形式的I/O评估来向您显示下一行的值.在4.2中我认为语法可能略有改变.我向你保证,这确实有效 - 我从3.0开始就使用它,而且我目前正在努力研究4.2和5.0. (2认同)