我仍然掌握着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? }
虽然有效,但看起来并不优雅。
我该如何有效地做到这一点?
答案 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
希望这会有所帮助。