Rails 4 ActiveRecord包含(:model)而没有default_scope

时间:2013-10-10 08:50:17

标签: ruby-on-rails activerecord

我的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)

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

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

4 个答案:

答案 0 :(得分:3)

以下是我在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)

答案 1 :(得分:1)

关系不保留此状态,稍后访问时(Rails 6.0)

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

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

to_a 在块中解析关系,因此有效地移除了作用域。

答案 2 :(得分:0)

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

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

或:

User.unscoped do
 Company.includes(:users).all
end

答案 3 :(得分: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 的解决方案对我不起作用,因为当UndeadUser从User继承时,rails会尝试添加WHERE users.type IN ('UndeadUser')