rails 3:包含find()

时间:2011-04-25 15:08:55

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个模型User,其中has_many:messages和message属于:user。

当我执行Message.find(1,:include =>:user)时,它不会返回给我用户,但如果我执行Message.find(1).to_json(:include =>:user),它会在哈希中包含用户对象。

我怎样才能将它包含在Message.find(1,:include =>:user)中?

4 个答案:

答案 0 :(得分:8)

这是一个急切/延迟加载的情况。当你这样做时:

Message.find(1, :include => :user)

您急切地加载用户,因为当您致电@message.user时,您没有进行另一次查询以获取用户,而在执行:

Message.find(1)

将找到该消息,并且调用@message.user将进行另一个SQL查询(也称为延迟加载)。

如果查看发送到服务器的实际SQL查询,您将看到在第一个示例中提取用户。

它没有显示的原因是因为当您检查@message时它只显示消息,而不是调用to_json,这会强制检查user

答案 1 :(得分:3)

它包括在内,所以如果你这样称呼:

@message = Message.find(1, :include => :user)
@message.user

第二个查询将不会被执行,因为用户已经加载,而

@message = Message.find(1)
@message.user

将执行两个查询

有用的截屏视频,了解正在发生的事情

  

http://railscasts.com/episodes/22-eager-loading

答案 2 :(得分:3)

此语法适用于rails 4。

Message.includes(:user).find(1)

答案 3 :(得分:2)

它包含在SQL查询中。当您致电Message.find(1, :include => :user).user时,不会执行任何查询。所有数据都加载到一个SQL查询中。

观察应用程序日志以获取证据(tail -f log/development.log)。