我有一个帐户和一个用户模型帐户has_one用户。所以在我的用户表中我有account_id。
我想为我的帐户创建一个范围,我可以传递has_user = TUE / FALSE,并返回有/无用户的帐户。
scope :has_user, -> (has_user) { where(...) }
有人可以帮忙写这个范围吗?
答案 0 :(得分:0)
我认为您可以创建两个范围,一个用于请求与用户关联的帐户,另一个用于相反的方式,这样可以避免传递参数,并且可以使用where
和where.not
,例如:
class Account < ApplicationRecord
has_one :user
scope :has_user, -> { includes(:user).where.not(users: { account_id: nil }) }
scope :has_not_user, -> { includes(:user).where(users: { account_id: nil }) }
end
其他方法可以创建一个接受布尔值的类方法,并使用if语句检查where和/或where.not:
def self.has_user(condition)
if condition
includes(:user).where.not(users: { account_id: nil })
else
includes(:user).where(users: { account_id: nil })
end
end
出于好奇:
def self.has_user(bool)
hash = { users: { account_id: nil } }
query = ->(assoc) { bool ? assoc.where.not(hash) : assoc.where(hash) }
query.(includes :user)
end
答案 1 :(得分:0)
使用原始sql,您可以使用JOINS编写更有效的查询,但这应该有效:
scope :has_user, -> (has_user) {
account_ids = User.where.not(account_id: nil).pluck(:account_id)
has_user ? where(id: account_ids) ? where.not(id: account_ids)
}
如果帐户has_one用户我假设那个用户所属的帐户,并且您的用户表上有一个account_id。
答案 2 :(得分:0)
其他方式是,
class Account < ApplicationRecord
has_one :user
scope :has_user, ->(has_user = true) {
criteria = (has_user == true ? 'IN' : 'NOT IN')
where("id #{criteria} (SELECT DISTINCT(account_id) FROM users)")
}
end
为has_user变量
分配默认值true Account.has_user # Accounts with user
Account.has_user(false) # Accounts without user