2013-05-15 5 views
0

Я все еще получаю зависть MongoDB и Mongoid и ударил эту промашку.Как выбрать все записи, где связанная коллекция пуста с Mongoid

Допустим, у меня есть User, что has_and_belongs_to_manyitems и, конечно, Item что has_and_belongs_to_manyusers.

Хотелось бы иметь возможность подсчитывать пользователей с помощью любых предметов.

this question рекомендуется добавление scope таким образом, я попытался добавить объем к User таких как

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

но User.count - User.has_no_items.count возвращает 0.

Я просмотрел .with_size, но это касается полей Array.

Что такое правильный способ сделать это, кроме

count = 0 
User.each { |u| count += 1 unless u.items.empty? } 

, который работает, но это, кажется, не очень элегантно.

Как это сделать эффективно?

ответ

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 

Надеюсь, что это поможет.

+0

Очень красивый и приятный подробный ответ; Благодарю. –

 Смежные вопросы

  • Нет связанных вопросов^_^