1

我对 mongoid 查询有点迷茫。我有一个拥有一家公司的用户。这是模型

class Company
    include Mongoid::Document
    include Mongoid::Timestamps

    field :name,                        :type => String
    field :description,         :type => String
    field :order_minimun,       :type => Float

    belongs_to :user

  def candidate_users
    User.where(:company_id => nil)
  end

end

class User
  include Mongoid::Document
    include Mongoid::Timestamps

    ROLES = %w[admin company_owner customer]

  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable,
  # :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :omniauthable

  ## Database authenticatable
  field :email,              :type => String, :default => ""
  field :encrypted_password, :type => String, :default => ""

  validates_presence_of :email
  validates_presence_of :encrypted_password

  ## Recoverable
  field :reset_password_token,   :type => String
  field :reset_password_sent_at, :type => Time

  ## Rememberable
  field :remember_created_at, :type => Time

  ## Trackable
  field :sign_in_count,      :type => Integer, :default => 0
  field :current_sign_in_at, :type => Time
  field :last_sign_in_at,    :type => Time
  field :current_sign_in_ip, :type => String
  field :last_sign_in_ip,    :type => String

    field :name,               :type => String
    field :last_name,          :type => String
    validates_presence_of :name
    #validates_uniqueness_of :name, :email, :case_sensitive => false

    field :roles_list,                  :type => Array , :default => ['customer']
    validates_uniqueness_of :email, :case_sensitive => false

    has_one :company
end

我想列出没有公司的用户以及拥有公司实例的用户。

我的第一次尝试(只是没有公司的用户):

  def candidate_users
    User.where(:company_id => nil)
  end

像这样的东西

def candidate_users
    User.any_of(:company_id => self.id, :company_id => nil)
  end

但我没有运气,这会返回所有用户。

有人可以帮我解决这个问题吗?

提前致谢。

4

1 回答 1

0

对于 mongoid,theforeign field总是在belongs_to关联的一边。所以Company对象会有一个user_id字段,但User对象不会有一个company_id字段。因此,您的查询返回所有用户是“正常的”

由于 mongodb 中没有 join 的概念,您可以通过反转关联(用户属于公司,公司 has_one 用户)来实现这一点,或者您可以执行两个查询:

# First, finding ids of users that have a company
ids = Company.excludes(user_id: nil).only(:_id).map(&:id)

# Then, find users whose ids are not in that array
users = User.not_in(_id: ids)

仍然保留关于any_of

any_of正在$or查询所有哈希参数。通过这样做User.any_of(:company_id => self.id, :company_id => nil),您只提供数组,这与User.where(:company_id => self.id, :company_id => nil). 我想你想做的是User.any_of({:company_id => self.id}, {:company_id => nil})

于 2012-09-25T16:16:44.330 回答