2014-07-24 4 views
0

저는 레일 4 개를 가지고 있고 상점과 책 (참조 1 : n 관계)이라는 2 개의 객체가 있습니다. 저장소에 많은 책이 있으며 각 책은 하나의 저장소에 속합니다. 일부 상점에는 책이 없습니다. 책이 하나 이상있는 최신 상점 3 개와 책이없는 최신 상점 3 개를 찾으려면 어떻게해야합니까? @books 만들하기레일 몽고이 드는 적어도 하나의 자식이있는 부모 요소를 검색합니다.

@stores = Store.order_by(:created_at => 'desc').limit(4).uniq 
@books = Book.order_by(:created_at => 'desc').limit(4).uniq 

이 작품 그러나 나는 가게의 경우 (book.exists?)를 수행하는 방법을 모른다는, 또는 확실히 각각의 책은 독특한 가게에 속한다.

답변

1

MongoDB의 기본 CRUD 작업은 콜렉션에서 작동하며 두 개의 콜렉션에서 작동 할 수있는 "결합"기능이 아직 구현되지 않았습니다. 이것을 이해하면 원하는 작업을 수행 할 수있는 두 가지 작업을 쉽게 만들 수 있습니다. 다음은 사용자가 제공 한 스키마 힌트 중에서 가장 분명합니다. 더 많은 작업을 수행하려면 포함 변경과 같은 스키마 변경을 고려해야합니다.

제공된 스키마는 정의에 따라 고유 한 상점에만 속할 수 있습니다. 책 검사에서 각 책에 대해 하나의 값인 store_id가 있음을 알 수 있습니다. 귀하의 이해를 돕기를 바랍니다.

응용 프로그램/모델/store.rb

class Store 
    include Mongoid::Document 
    include Mongoid::Timestamps 
    field :name, type: String 

    has_many :books 
end 

응용 프로그램/모델/book.rb

class Book 
    include Mongoid::Document 
    include Mongoid::Timestamps 
    field :title, type: String 

    belongs_to :store 
end 

가 'test_helper' 을 필요로 테스트/단위/store_test.rb 필요한 ' pp '

class StoreTest < ActiveSupport::TestCase 
    def setup 
    Mongoid.default_session.drop 
    end 
    test '0. mongoid version' do 
    puts "\nMongoid::VERSION:#{Mongoid::VERSION}\nMoped::VERSION:#{Moped::VERSION}" 
    end 
    test 'store query has book, does not have book' do 
    [ 
     ["Amazon.com", ["Outlander", "Taking It All"]], 
     ["Barnes & Noble", ["Big Little Lies"]], 
     ["Goodreads", []], 
     ["Greenlight Bookstore", []], 
     ["Powell's Books", ["Gone Girl", "Dark Skye"]], 
     ["Strand Books", []] 
    ].each do |store, books| 
    store = Store.create(name: store) 
    books.each do |title| 
     store.books << Book.create(title: title) 
    end 
    sleep 1 
    end 
    assert_equal(6, Store.count) 
    assert_equal(5, Book.count) 
    puts 
    store_ids_with_books = Book.distinct(:store_id) 
    latest_stores_with_a_book = Store.in(_id: store_ids_with_books).order_by(:created_at => 'desc').limit(3).to_a 
    puts "three latest stores with a book:" 
    pp latest_stores_with_a_book 
    latest_stores_without_a_book = Store.nin(_id: store_ids_with_books).order_by(:created_at => 'desc').limit(3).to_a 
    puts "three latest stores without a book:" 
    pp latest_stores_without_a_book 
    puts "books:" 
    pp Book.all.to_a 
    end 
end 

레이크 테스트

Run options: 

# Running tests: 

[1/2] StoreTest#test_0._mongoid_version 
Mongoid::VERSION:3.1.6 
Moped::VERSION:1.5.2 
[2/2] StoreTest#test_store_query_has_book,_does_not_have_book 
three latest stores with a book: 
[#<Store _id: 53f257287f11ba75e5000008, created_at: 2014-08-18 19:42:32 UTC, updated_at: 2014-08-18 19:42:32 UTC, name: "Powell's Books">, 
#<Store _id: 53f257257f11ba75e5000004, created_at: 2014-08-18 19:42:29 UTC, updated_at: 2014-08-18 19:42:29 UTC, name: "Barnes & Noble">, 
#<Store _id: 53f257247f11ba75e5000001, created_at: 2014-08-18 19:42:27 UTC, updated_at: 2014-08-18 19:42:27 UTC, name: "Amazon.com">] 
three latest stores without a book: 
[#<Store _id: 53f257297f11ba75e500000b, created_at: 2014-08-18 19:42:33 UTC, updated_at: 2014-08-18 19:42:33 UTC, name: "Strand Books">, 
#<Store _id: 53f257277f11ba75e5000007, created_at: 2014-08-18 19:42:31 UTC, updated_at: 2014-08-18 19:42:31 UTC, name: "Greenlight Bookstore">, 
#<Store _id: 53f257267f11ba75e5000006, created_at: 2014-08-18 19:42:30 UTC, updated_at: 2014-08-18 19:42:30 UTC, name: "Goodreads">] 
books: 
[#<Book _id: 53f257247f11ba75e5000002, created_at: 2014-08-18 19:42:28 UTC, updated_at: 2014-08-18 19:42:28 UTC, title: "Outlander", store_id: "53f257247f11ba75e5000001">, 
#<Book _id: 53f257247f11ba75e5000003, created_at: 2014-08-18 19:42:28 UTC, updated_at: 2014-08-18 19:42:28 UTC, title: "Taking It All", store_id: "53f257247f11ba75e5000001">, 
#<Book _id: 53f257257f11ba75e5000005, created_at: 2014-08-18 19:42:29 UTC, updated_at: 2014-08-18 19:42:29 UTC, title: "Big Little Lies", store_id: "53f257257f11ba75e5000004">, 
#<Book _id: 53f257287f11ba75e5000009, created_at: 2014-08-18 19:42:32 UTC, updated_at: 2014-08-18 19:42:32 UTC, title: "Gone Girl", store_id: "53f257287f11ba75e5000008">, 
#<Book _id: 53f257287f11ba75e500000a, created_at: 2014-08-18 19:42:32 UTC, updated_at: 2014-08-18 19:42:32 UTC, title: "Dark Skye", store_id: "53f257287f11ba75e5000008">] 
Finished tests in 6.193234s, 0.3229 tests/s, 0.3229 assertions/s.    
2 tests, 2 assertions, 0 failures, 0 errors, 0 skips