2012-05-20 50 views
0

這基本上是一個簡單的任務,但我不能找到一種方法,如何使用,從它的協會所屬的按鍵在Mongomapper型號排序/順序數據排序數據。Monggomapper:與其關聯模型的鑰匙

就像假設我有兩個型號:

class Product 
include MongoMapper::Document 

key :name, String 
key :product_category_id, ObjectId 

belongs_to :product_category 
end 

class ProductCategory 
include MongoMapper::Document 

key :name, String, :required => true, :unique => true 
end 

所有我想要做的就是簡單的得到,通過它的「產品類別名稱」排序「產品」的數據。我已經嘗試過:

Product.where(:name => /#{@keyword}/i).sort("product_category.name".to_sym) 

,但沒有工作,和許多其他的方式,在返回執行錯誤:(...

是任何人可以幫助我解決這個??真的很感謝了很多...

感謝

問候, 羅尼

回答

1

正如你的問題,產品和產品分類規定被映射到MongoDB中單獨集合。 因此,您不能進行SQL連接,排序,選擇和唯一。 MongoDB不會爲普通查詢訪問多個集合。 您可以在本地內存中對產品進行排序,但這需要提取產品及其關聯的產品類別。

Products.all.sort{|a, b| a.product_category.name <=> b.product_category.name} 

但是,您可以通過MongoDB的利用嵌入的,這樣的數據都在一個集合,因此容易排序。

class Product 
    include MongoMapper::Document 

    key :name, String 
    one :product_category 
end 

class ProductCategory 
    include MongoMapper::EmbeddedDocument 

    key :name, String 
end 

請注意,ProductCategory是EmbeddedDocument。 下面的測試按'product_category.name'顯示了一個MongoMapper排序子句。 希望這有助於你的理解和進步。

測試/單位/ product_test.rb

require 'test_helper' 

class ProductTest < ActiveSupport::TestCase 
    def setup 
    Product.delete_all 
    end 

    test "association sort" do 
    Product.create(name: 'Act of Valor', product_category: ProductCategory.new(name: 'movie')) 
    Product.create(name: 'Oliver Twist', product_category: ProductCategory.new(name: 'book')) 
    assert_equal(2, Product.count) 

    products_by_db_order = Product.all.to_a 
    assert_equal(['Act of Valor', 'Oliver Twist'], products_by_db_order.map(&:name)) 
    p products_by_db_order.map(&:name) 

    products_by_category_order = Product.sort('product_category.name').to_a 
    assert_equal(['Oliver Twist', 'Act of Valor'], products_by_category_order.map(&:name)) 
    p products_by_category_order.map(&:name) 
    end 
end 

輸出

Run options: --name=test_association_sort 

# Running tests: 

["Act of Valor", "Oliver Twist"] 
["Oliver Twist", "Act of Valor"] 
. 

Finished tests in 0.042368s, 23.6027 tests/s, 70.8082 assertions/s. 

1 tests, 3 assertions, 0 failures, 0 errors, 0 skips 
+0

Woaa ..多謝加里:d,你救我的天^^ ..它的工作..但我有點好奇Mongomapper,當我用「Product.all」,然後使用排序呢「之類{| A,b | a.product_category.name <=> b.product_category.name}」它的工作.. 但是,當我使用條件查詢,如「Product.where(condition)」,「sort {| a,b | a.product_category.name <=> b.product_category.name}「功能不工作.. 所以我的解決辦法是,當我使用狀態查詢,我必須把它轉換成數組‘to_a’,然後再使用」排序{| A,B | a.product_category.name <=> b.product_category.name}「.. 再次感謝Gary:D –

+0

令人困惑的是,您正在對不同類的對象調用」sort「方法,請嘗試使用Rails控制檯(rails c)只需將第一部分輸入.class - Product.all.class => Array,Product.where.class => Plucky :: Query,Product.sort.class => Plucky :: Query,Product.sort。 to_a.class => Array。所以Product.all.sort調用Array#sort,而Product.where.sort調用Plucky :: Query#sort。你必須用finder方法之一來完成你的查詢來生成一個實際的DB查詢並返回結果。 –

+0

OO我明白了..現在我明白了原因:D ..非常感謝幫助我:) –