0

これは基本的に簡単な作業ですが、その関連付けに属するキーを使用して Mongomapper モデルでデータの並べ替え/順序付けを実行する方法が見つかりません。

たとえば、2 つのモデルがあるとします。

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)

しかし、機能していません。また、エラーを返す他の多くの方法:(...

誰かがこれを解決するのを手伝ってくれますか?? 本当にたくさんの感謝...

ありがとう

よろしく、 ロニー

4

1 に答える 1

1

質問で指定されているように、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
于 2012-05-22T02:05:31.240 に答える