rails / activerecord搜索渴望加载的关联

时间:2009-12-21 21:54:12

标签: ruby-on-rails activerecord

我有一个简单的查找声明:

m = MyModel.find(1, :include => :my_children)

m.mychildren是一个数组;无论如何都要从数组中找到一个特定的记录而不必迭代整个事物。如果我执行mychildren.find(1),那么新的数据库查询就会出现问题,这是没有意义的,因为它们已经全部加载了

2 个答案:

答案 0 :(得分:1)

看起来这里有一点Rails魔法。 Enumerable#find在为关联创建的方法上被ActiveRecord::Base#find覆盖的位置。

在优势上,Enumerable#find的别名是Enumerable#detect。 不幸的是,Enumerable#find / Enumerable#detect与ActiveRecord :: Base #find的语法明显不同。

所以你不能只做mychildren.find(1),如果你想避免再次访问数据库,你必须做mychildren.detect{|c| c.id == 1}。您可能还需要考虑扩展Array以实现更干的方式。

class Array 
  def id_find id
    self.detect{|element| element.id == id}
  end
end

答案 1 :(得分:0)

我不太确定你的要求,但是你试过select

m.mychildren.select{ |child| child == <<some_statement>> }

假设您使用了问题中所述的:include选项,则无法访问数据库。

或者,如果你知道你想要的孩子的数量,你应该可以使用

m.mychildren[1]