帐户具有用户的Rails范围

时间:2017-11-08 19:01:25

标签: ruby-on-rails ruby-on-rails-4 ruby-on-rails-5

我有一个帐户和一个用户模型帐户has_one用户。所以在我的用户表中我有account_id。

我想为我的帐户创建一个范围,我可以传递has_user = TUE / FALSE,并返回有/无用户的帐户。

scope :has_user, -> (has_user) { where(...) }

有人可以帮忙写这个范围吗?

3 个答案:

答案 0 :(得分:0)

我认为您可以创建两个范围,一个用于请求与用户关联的帐户,另一个用于相反的方式,这样可以避免传递参数,并且可以使用wherewhere.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