我有一个简单的查找声明:
m = MyModel.find(1, :include => :my_children)
m.mychildren是一个数组;无论如何都要从数组中找到一个特定的记录而不必迭代整个事物。如果我执行mychildren.find(1),那么新的数据库查询就会出现问题,这是没有意义的,因为它们已经全部加载了
答案 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]