ActiveRecord :: Relation上下文中的独立ActiveRecord查询

时间:2017-09-20 15:01:12

标签: ruby-on-rails ruby activerecord ruby-on-rails-5 activerecord-relation


在rails代码上有一些ruby

class User < ActiveRecord::Base
  def self.all_users_count
    User.all
  end
end

User.all_users_count
例如,返回 100

User.limit(5).all_users_count
现在,由于ActiveRecord :: Relation上下文,它返回 5 ,尽管我的类名为User.all,而不是简单的all (.to_sql显示该查询始终包含limitwhere id或其他情况下的其他内容)

那么,我如何在模型方法中进行与上下文无关的AR查询?像User.all和其他人一样?

谢谢!

聚苯乙烯。或许我的代码有错误或类似的东西,事实上User.all在任何方法和上下文中总是必须返回此模型表的正确行数

1 个答案:

答案 0 :(得分:1)

这非常奇怪和出乎意料(遗憾的是我无法确认,因为我的计算机崩溃了,手头没有铁轨项目)。

我希望

User.all 

创建新范围(或称为上下文)

尝试使用

解决此问题
User.unscoped.all

编辑:

我在我的项目和干净的rails repo上尝试过,结果是一致的。

思考了一下 - 这可能不是一个问题 - 我认为你的方法可能有问题。

你会在什么情况下链接User.limit(2).all_users_count?我什么都想不到。因为您需要所有用户都需要计算,并且您拨打User.all_usert_count(或只是User.count

...或者您需要其他内容并致电User.limit(2).where(...) - 在该链中调用all_users_count没有意义,是吗?

而且,当你想到它时,它是有道理的。想象一下,你有一些不同的方法,比如count_retired,你对这种调用有什么期望:

User.limit(2).count_retired

不超过2的退休用户数,或系统中所有已退休用户的数量?我期待前者。

所以我认为这里有两种可能性之一:

  • 要么你实现了错误,要么采用不同的方式(如上文编辑部分所述)
  • 或者你有一些更复杂的问题,但你把你的例子煮到了他们不再有意义的地步(如果你愿意,请跟进另一个问题,请在评论中告诉我链接,如果你这样做,因为听起来很有趣)