我的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模型。
有没有办法做到这一点?谢谢你的任何想法!
答案 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')
。