5

我的 Rails 应用程序中有以下情况。有两种模型,比如说用户和公司:

class User < ActiveRecord::Base
  belongs_to :company
  default_scope -> {where(removed_at: nil)}
end

class Company < ActiveRecord::Base
  has_many :users
end

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

Company.unscoped.all.includes(:users)

什么将导致对包含默认范围的用户表的查询。因此,我获得了预取所有未删除用户的公司记录。但在这种情况下,我也希望 remove_at 不为空的用户(=> 删除的用户记录)。“unscoped”方法仅适用于 Company 模型,不适用于 User 模型。

有没有办法做到这一点?感谢您的任何想法!

4

4 回答 4

4

这是我在 Rails 4.0 应用程序中使用的解决方案

class User < ActiveRecord::Base
  belongs_to :company
  default_scope -> {where(removed_at: nil)}
end

class UserUnscoped < User
  self.default_scopes = []
end

class Company < ActiveRecord::Base
  has_many :users, class_name: "UserUnscoped"
end

Company.unscoped.all.includes(:users)
于 2014-07-24T16:16:56.103 回答
3

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

User.unscoped { Company.includes(:users).all }

或者:

User.unscoped do
 Company.includes(:users).all
end
于 2013-10-10T10:12:03.667 回答
1

该关系在以后访问它时不会保留此状态(Rails 6.0)

在某些情况下,一种可能的解决方法是强制解决,例如:

User.unscoped { Company.includes(:users).to_a }

to_a在块中解析关系,因此有效地删除了范围。

于 2021-03-23T15:37:44.330 回答
0

我有一个大大分支的 STI 模型集。因此,对我有用的唯一方法(Rails 4.2.5)如下:

class UndeadUser < ActiveRecord::Base
  self.table_name = 'users'
end

class User < UndeadUser
  # real logic here
end

class Employee < User; end
class Manager < Employee; end

# grouping model
class Organization < ActiveRecord::Base
  has_many :employees

  has_many :users, class: UndeadUsers
  before_destroy :really_destroy_users_and_data! # in case of using acts_as_paranoid or paranoia gems it might be helpful
end

@abstractcoder的解决方案对我不起作用,因为WHERE users.type IN ('UndeadUser')当 UndeadUser 从 User 继承时,rails 会尝试添加。

于 2015-11-26T17:00:35.917 回答