如何使用Mongoid选择相关集合为空的所有记录

时间:2013-05-15 07:37:25

标签: mongodb associations counting mongoid3

我仍然掌握着MongoDB和Mongoid,并且遇到了这个问题。

假设我有User has_and_belongs_to_many items,当然还有Item has_and_belongs_to_many users

我希望能够使用任何项目计算用户数。

this question建议添加scope,因此我尝试将范围添加到User,例如

scope :has_no_items, where(:items.empty?)

User.count - User.has_no_items.count会返回0

我查看了.with_size,但这是特定于数组字段的。

除了

之外,执行此操作的正确方法是什么
count = 0
User.each { |u| count += 1 unless u.items.empty? }

虽然有效,但看起来并不优雅。

我该如何有效地做到这一点?

1 个答案:

答案 0 :(得分:1)

以下适用于我的Rails 3.2.13,Mongoid 3.1.4,Moped 1.5.0。

应用程序/模型/ user.rb

class User
  include Mongoid::Document
  field :name, type: String
  has_and_belongs_to_many :items
  scope :has_items, where(:item_ids.ne => nil)
  scope :has_no_items, where(:item_ids => nil)
end

应用程序/模型/ item.rb的

class Item
  include Mongoid::Document
  field :name, type: String
  has_and_belongs_to_many :users
end

测试/单元/ user_test.rb

要求'test_helper'

class UserTest < ActiveSupport::TestCase
  def setup
    User.delete_all
    Item.delete_all
  end

  test "users without items" do
    fagin = User.create(:name => 'Fagin')
    oliver = User.create(:name => 'Oliver')
    fagin.items << Item.create(:name => 'cane')
    assert_equal 2, User.count
    assert_equal 1, Item.count
    assert_equal 1, User.has_items.count
    assert_equal 1, User.has_no_items.count
    puts
    puts "User.has_items: #{User.has_items.to_a.inspect}"
    puts "User.has_no_items: #{User.has_no_items.to_a.inspect}"
  end
end

rake test

Run options:

# Running tests:

[1/1] UserTest#test_users_without_items
User.has_items: [#<User _id: 51df00987f11ba3d7d000001, name: "Fagin", item_ids: ["51df00987f11ba3d7d000003"]>]
User.has_no_items: [#<User _id: 51df00987f11ba3d7d000002, name: "Oliver", item_ids: nil>]
Finished tests in 0.042205s, 23.6939 tests/s, 94.7755 assertions/s.
1 tests, 4 assertions, 0 failures, 0 errors, 0 skips

希望这会有所帮助。