Mat*_*Mat 5 ruby sql ruby-on-rails
在我的模型中,我有users(User)和stories(Story),关系:user has_many stories.
我在shell中发现了一些奇怪的东西:
(dev) user.stories.any?
=> true
(dev) user.stories
Story Load (1.6ms) SELECT "stories".* FROM "stories" WHERE "stories"."user_id" = 703 ORDER BY created_at ASC [["user_id", 703]]
=> []
(dev) user.stories.any?
=> false
Run Code Online (Sandbox Code Playgroud)
这是如何运作的?这是由于我的代码,还是Rails中的某种错误以及它查询数据库的方式?
我发现的解决方法(感谢@house9)是使用:
user.stories.to_a.any?
user.stories.to_a.empty? # also works with empty?
Run Code Online (Sandbox Code Playgroud)
这样,Rails 就被迫进行查询。而且开销非常低,因为执行to_a.any?多次只会查询一次。
或者更好的是,正如@Jordan建议的那样,使用:
user.stories.exists?
Run Code Online (Sandbox Code Playgroud)