我正在尝试组合一系列可以使用ActiveRecord动态创建和执行复杂查询的类。我对整个做法感到非常满意:
MyModel.select("id, name, floober").join(:creator).where(:is_active => true)
我正在努力的是使用这些东西建立一个查询,无法确定每种可能方法的数量(连接数,数量或where子句,限制,组等)提前时间。我可能有2个连接,或者没有连接,具体取决于它的调用位置。
由于我如何获得这些东西的性质 - 连接列表,列列表,where子句列表等等 - 我可以盲目地将它们链接在一起。我必须将列连接在一起,排列连接,链接where子句,所以我无法遍历各种列表。
我正在努力避免编写任何原始SQL。
我尝试过的一件事就是将ruby语句作为一个字符串构建,然后在最后评估它,当我完成后,我感觉很脏,就像我需要洗个澡一样。我正在寻找的是一种缓存查询状态的方法,直到所有部分都已累积,然后执行它们。
我是否“离开Rails”?
提前感谢...
答案 0 :(得分:56)
我想我明白了。基于我对AR查询方法的理解,我完全不合适。事实证明,在您实际尝试使用结果之前,ActiveRecord实际上并不执行查询。因此,可以执行以下操作:
model_query = MyModel.select("column12, column32")
model_query = model_query.joins(:user)
model_query = model_query.where(:column12 => true)
然后在完成所有事情之后你可以做到
model_query.each do |record|
...
end
在您调用每个(或您使用的任何需要查询结果的方法)之前,查询实际上并未执行。
答案 1 :(得分:0)
在这种情况下,send
可能是您的朋友。它仍然是非常随意的代码执行,但至少你没有使用eval
。您是否一次性拥有这些查询部分或者是否随着时间的推移构建它们并不完全清楚。如果它们出现在一个http请求/响应周期中,那么迭代查询部分并执行send
,视情况而定。
OTOH,如果您是通过Ajax或其他条件累积的方式获取它,您可能需要查看缓存现有部分或一些更奇特的解决方案。