bra*_*rad 11 sql join arel ruby-on-rails-3
我有一个相当复杂的SQL查询,我很确定我无法用ARel完成(Rails 3.0.10)
查看链接,但它有一些连接和一个where exists子句,我很确定对于ARel来说太复杂了.
然而我的问题是,在此查询过于复杂之前,使用ARel我可以使用includes其他模型来避免n + 1问题.既然我正在使用find_by_sql,那就不行了includes.我仍然希望能够获取这些记录并将它们附加到我的模型实例,方式includes如此,但我不太确定如何实现这一点.
有人能指出我正确的方向吗?
我还没有尝试在同一个查询中加入它们.我只是不确定它们将如何映射到对象(即,如果ActiveRecord将它们正确映射到正确的类)
我知道当使用includesActiveRecord实际进行第二次查询时,会以某种方式将这些行附加到原始查询中的相应实例.有人可以告诉我如何做到这一点吗?或者我是否需要加入相同的查询?
Rob*_*Rob 22
让我们假装SQL真的不能简化为Arel.并非一切都可以,我们碰巧真的想要保留我们的自定义find_by_sql,但我们也想使用包含.
然后preload_associations是你的朋友:(更新为Rails 3.1)
class Person
def self.custom_query
friends_and_family = find_by_sql("SELECT * FROM people")
# Rails 3.0 and lower use this:
# preload_associations(friends_and_family, [:car, :kids])
# Rails 3.1 and higher use this:
ActiveRecord::Associations::Preloader.new(friends_and_family, [:car, :kids]).run
friends_and_family
end
end
Run Code Online (Sandbox Code Playgroud)
请注意3.1方法要好得多,b/c你可以随时应用eager-loading.因此,您可以获取控制器中的对象,然后在渲染之前,您可以检查格式并急切加载更多关联.这就是我发生的事情 - HTML不需要急切的加载,但.json确实如此.
这种帮助?