正如你的問題,產品和產品分類規定被映射到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
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 –
令人困惑的是,您正在對不同類的對象調用」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查詢並返回結果。 –
OO我明白了..現在我明白了原因:D ..非常感謝幫助我:) –