我正在尝试将一系列可以使用ActiveRecord动态创建和执行复杂查询的类放在一起。我对整个做法感到非常舒服:
MyModel.select("id, name, floober").join(:creator).where(:is_active => true)
我正在努力解决的是使用这些东西来构建一个查询,而无法提前确定每种可能的方法(连接数、数量或 where 子句、限制、组等)的数量。 我可能有 2 个联接,也可能没有联接,具体取决于从哪里调用它。
由于我如何获得这些东西的性质 - 连接列表,列列表,where子句列表等 - 我可以盲目地将它们链接在一起。我必须将列连接在一起,排列连接,链接 where 子句,所以我无法遍历各种列表。
我试图避免编写任何原始 SQL。
我尝试的一件事是将红宝石语句构建为字符串,然后在最后回避它,当我完成时,我感觉很脏,就像我需要洗澡一样。我正在寻找一种缓存查询状态的方法,直到所有部分都累积完毕,然后执行它们。
我是否"偏离轨道"徘徊?
提前感谢...
我想通了。我对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
在调用每个(或您使用的任何需要查询结果的方法)之前,查询不会实际执行。
我是通过观看Railscasts 202和215得到的。我爱瑞安·贝茨。
在这种情况下,send
可能是你的朋友。它仍然是相当任意的代码执行,但至少你没有使用eval
.目前还不完全清楚您是同时拥有这些查询部分,还是随着时间的推移而构建它们。如果它们存在于一个 http 请求/响应周期中,那么遍历查询部分并根据需要执行send
是有意义的。
OTOH,如果您通过 Ajax 或其他条件累积的方式获得它,您可能需要考虑缓存现有部分或一些更奇特的解决方案。