Ruby on Rails:#any?返回错误的值

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中的某种错误以及它查询数据库的方式?

Mat*_*Mat 0

我发现的解决方法(感谢@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)