Ruby 和 Rails 的新手,如果我的术语有点不对,请原谅我。
我正在优化一些继承的代码并查看日志,因为 .rabl 文件中有这样的行,所以我看到查询重复自己:
node(:program) { |user| (!user.programs.first.nil?) ? user.programs.first.name : '' }
user
并且program
都是活动记录对象
转到 rails 控制台,我可以复制问题,但也可以获得预期的行为,这只是一个查询:
>u = User.find(1234)
User Load (0.3ms) SELECT `users`.* FROM `users` WHERE [...]
> (!u.programs.first.nil?) ? u.programs.first.name : ''
Program Load (0.2ms) SELECT `programs`.* FROM `programs` [...]
Program Load (0.3ms) SELECT `programs`.* FROM `programs` [...]
=> "Output"
请注意,在控制台中重复三元语句总是会给我 2 个查询。
我可以得到这样的预期行为:
> newu = User.find(12345)
User Load (3.8ms) SELECT `users`.* FROM `users` WHERE [...]
> newu.programs
Program Load (0.6ms) SELECT `programs`.* FROM `programs` [...]
> (!newu.programs.first.nil?) ? newu.programs.first.name : ''
=> "Output"
现在重复三元语句根本不会重新查询。
所以问题是:为什么调用newu.programs
会改变行为?不应该调用u.programs.first.nil?
也以相同的方式加载所有程序记录吗?