ARel模仿包含find_by_sql

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确实如此.

这种帮助?