访问ActiveRecord :: AssociationRelation的任意元素而无需额外的数据库查询

时间:2016-01-04 15:50:19

标签: ruby-on-rails activerecord

给定创建的关系,如何在不触发其他数据库查询的情况下访问与某些(非常简单)条件匹配的关系元素?

class Foo < ActiveRecord::Base
  has_many :bars
end

class Bar < ActiveRecord::Base
  belongs_to :foo
end

joined = Foo.all.joins(:bars).select('foos.*, bars.baz')

a = joined.to_a # no additional query
b = joined.find_by_baz(1) # these will both generate additional queries
c = joined.find_by_baz(4) #   even though the data is already available

我可能会遗漏一些简单的东西,但有没有办法通过任意值访问关联的任意元素?

我想到的一个可能的解决方法是将关联加载到由我有兴趣搜索的值索引的数组中。这似乎比理想的更脆弱。

1 个答案:

答案 0 :(得分:0)

有几种方法可以过滤数据,一种来自数据库,这就是你所做的:joined.find_by_baz(1)另一种方法是对数组进行过滤,你可以这样做:

joined.to_a.select{|a| a.baz == 1}

这不会进行额外的数据库调用,但会使用native select within the Enumarable module

就个人而言,我会采用数据库方法。