没有它的default_scope的Rails 4 ActiveRecord include(:model)

mil*_*man 5 activerecord ruby-on-rails

我的Rails应用程序中存在以下情况。假设有用户和公司两种模型:

class User < ActiveRecord::Base
  belongs_to :company
  default_scope -> {where(removed_at: nil)}
end
Run Code Online (Sandbox Code Playgroud)

class Company < ActiveRecord::Base
  has_many :users
end
Run Code Online (Sandbox Code Playgroud)

我现在想要的是加载公司记录并包括用户

Company.unscoped.all.includes(:users)
Run Code Online (Sandbox Code Playgroud)

这将导致对包含默认范围的用户表的查询。因此,我获得了所有未删除的用户都已预取的公司记录。但是在这种情况下,我确实也希望其中remove_at不为null的用户(=>已删除的用户记录)。“不受范围限制”的方法仅适用于公司模型,而不适用于用户模型。

有什么办法吗?感谢您的任何想法!

use*_*775 3

该方法接受一个块。块内的所有查询都不会使用default_scope:

User.unscoped { Company.includes(:users).all }
Run Code Online (Sandbox Code Playgroud)

或者:

User.unscoped do
 Company.includes(:users).all
end
Run Code Online (Sandbox Code Playgroud)

  • 不,不幸的是这并不能避免调用default_scope(Rails 4)。 (4认同)