我渴望加载与其关联的模型对象:
user= User.includes(:posts).find(1)
但随后在代码中的某些点,我想这样做:
user.posts.where(:topic => "x")
但是,这只是再次重新运行查询。 所以不是我想我应该这样做:
user.posts.select{|post| post.topic == "x" }
这不会重新运行查询。 但我有几个问题。
首先,这是做的正确方法?
其次,我有点困惑什么选择呢在这种情况下。 因为,即使我没有使用过,当我运行最后一行包括功能,它运行查询,然后后,如果我再次运行它,它不..所以是有某种形式的缓存所涉及的第一次? 因为当我使用WHERE子句运行查询每一次。
谢谢。
select
是在可枚举一个Ruby方法。 第一次运行
user.posts.select{|post| post.topic == "x" }
所有Post
的情况下, user
的:posts
协会将被从数据库到内存中加载; 具体到一个ActiveRecord集合对象。 select
,然后调用这个收集,过滤掉所有Post
与集合中的实例:topic
属性比其他任何"x"
。
运行上面的行第二次不会再查询数据库,因为你已经加载的posts
到内存中。
当你做一个includes
像下面
user= User.includes(:posts).find(1)
它要急切负载:posts
对于每个关系User
实例返回(在这种情况下,单个User
,其中:id
是1
)。 您现在都Post
加载到内存中的实例如上一节所述。
如果你再这样做
user.posts.where(:topic => "x")
现在你告诉轨运行针对一个新的查询Post
,这次发现的所有Post
实例,其中:topic
是"x"
和其中:user_id
是:id
的的user
。 where
不工作就像一个内存AREL集合的“过滤器”。