質問で指定されているように、Product と ProductCategory は MongoDB の個別のコレクションにマップされます。そのため、SQL の結合、並べ替え、選択、および一意化を行うことはできません。MongoDB は、通常のクエリで複数のコレクションにアクセスすることはありません。ローカル メモリ内の製品を並べ替えることができますが、これには、製品と関連する product_categories の両方を取得する必要があります。
Products.all.sort{|a, b| a.product_category.name <=> b.product_category.name}
ただし、埋め込みを利用して、データをすべて 1 つのコレクションにまとめ、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