rails 3 :include with find()



我有一个模型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)。

最新更新