Domanda

Questo è fondamentalmente un compito semplice, ma non riesco a trovare un modo come eseguire un tipo di ordinamento / ordine nel modello mongomapper con i tasti che appartiene alla sua associazione.

Come supponiamo di avere due modelli:

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
.

Tutto quello che voglio fare è semplice ottenere i dati da 'Prodotto' che ordinati per il suo "nome della categoria di prodotto". Ho già provato:

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

Ma non funziona, e molti altri modi in cui eseguono un errore in ritorno: (...

Qualcuno potrebbe aiutarmi a risolvere questo ??Apprezzo davvero molto ...

Grazie

Saluti, Ronny

È stato utile?

Soluzione

Come specificato nella tua domanda, prodotto e productCategory sono mappati su collezioni separate in MongoDB. Come tale, non è possibile eseguire un join di SQL, ordinare, selezionare e unico.Mongodb non accederà più di una raccolta per una normale query. È possibile ordinare i prodotti nella memoria locale, ma ciò richiede il recupero dei prodotti sia dei prodotti e dei loro prodotti associati.

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

Tuttavia, è possibile sfruttare l'incorporamento in modo che i dati siano tutti in una collezione, e quindi facilmente ordinabili da mongodb.

class Product
  include MongoMapper::Document

  key :name, String
  one :product_category
end

class ProductCategory
  include MongoMapper::EmbeddedDocument

  key :name, String
end
.

Nota che ProductCategory è un embeddedDocument. Il test qui sotto mostra una clausola di ordinamento mongomapper per 'product_category.name'. Spero che questo ti aiuti la tua comprensione e il tuo progresso.

Test / unità / prodotto_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
.

output

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
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top