我有一个模型User,其中has_many:messages和message属于:user。
当我执行Message.find(1,:include =>:user)时,它不会返回给我用户,但如果我执行Message.find(1).to_json(:include =>:user),它会在哈希中包含用户对象。
我怎样才能将它包含在Message.find(1,:include =>:user)中?
答案 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
将执行两个查询
有用的截屏视频,了解正在发生的事情
答案 2 :(得分:3)
此语法适用于rails 4。
Message.includes(:user).find(1)
答案 3 :(得分:2)
它包含在SQL查询中。当您致电Message.find(1, :include => :user).user
时,不会执行任何查询。所有数据都加载到一个SQL查询中。
观察应用程序日志以获取证据(tail -f log/development.log
)。