我有一个模型User,其中has_many:messages和Message,其中belong_to: User。
当我执行Message。find(1,:include =>:user)它不会返回用户,但如果我做Message.find(1)。To_json (:include =>:user)它确实在哈希中包含了user对象。
我怎么能得到它包括它的消息。查找(1,:include =>:user) ?
这是一个急于/延迟加载的例子。当你这样做的时候:
Message.find(1, :include => :user)
你正在急切地加载用户,因为当你调用@message.user
时,你没有做另一个查询来获取用户,而做:
Message.find(1)
将找到消息,并调用@message.user
将进行另一个SQL查询(也称为延迟加载)。
如果您查看发送到服务器的实际SQL查询,您将看到您实际上是在第一个示例中获取用户。
它不显示的原因是因为当您检查@message
时,它只显示消息,而不是调用to_json
,这强制检查user
。
它是包含的,所以如果你调用它:
@message = Message.find(1, :include => :user)
@message.user
第二个查询不会执行,因为user已经加载,而
@message = Message.find(1)
@message.user
将同时执行两个查询
和有用的视频来理解发生了什么
http://railscasts.com/episodes/22-eager-loading
这个语法可以在rails 4中使用。
Message.includes(:user).find(1)
包含在SQL查询中。当您调用Message.find(1, :include => :user).user
时,不会为此执行任何查询。所有的数据都在一个SQL查询中加载。
查看应用日志的证据(tail -f log/development.log
)。