6

私は2つのモデルを持っています:

#Product
class Product < ActiveRecord::Base
  has_and_belongs_to_many :categories
  attr_accessible :name
  ...
end

#Category
class Category < ActiveRecord::Base
  has_and_belongs_to_many :products, :order => "name ASC"

  attr_accessible :name, :priority
end

そして、優先順位の最も高いカテゴリ、次に製品名で製品を並べたいと思います

たとえば、次の 3 つのカテゴリがあります。

  • お菓子、優先度=3
  • 果物、優先度 = 1
  • デザート、優先度 = 2

3 製品:

  • デザートとスイーツのカテゴリーを持つチョコレートアイスクリームは、
  • デザートやスイーツのカテゴリーがあるクッキー、
  • スイーツ、フルーツ、デザートのカテゴリーがあるキウイ

そして、私はそれらを次のように注文したいと思います:

  • キウイ(フルーツが最優先なので最初)
  • チョコレート アイス クリーム (2 番目は、チョコレートがクッキーよりも優先され、両方のカテゴリが同じ優先度であるため)
  • クッキー

Railsでそれを行うにはどうすればよいですか? 私は自分の製品を複製したくありません。

Category.order("priority ASC").each do |cat|
  cat.products.order("name ASC").each do |product|
  end
end

ただし、その場合、キウイ、チョコレート アイス クリーム、クッキーはすべて複数のカテゴリがあるため、複製されます。重複を削除する簡単な方法はありますか? または、カテゴリ最優先で直接商品を注文する方法はありますか?

編集:達成したいことの詳細

私が実際に欲しいのは、左側にすべての製品 (および一意の製品ごとに 1 行のみ) をカテゴリ別に並べた巨大なテーブルです...次のようなものを作成できるようにします。

  • カテゴリ - 製品
  • フルーツ - バナナ
  • 果物 - リンゴ
  • フルーツ - キウイ
  • デザート - チョコレートアイスクリーム
  • デザート - クッキー
  • スウィート - チョコレートキャンディー
  • スウィート - アップルキャンディー
  • ...

見る?フルーツがデザートやスイーツであっても、このテーブルに一度だけ登場してほしい。そして、製品を「最も重要な」カテゴリに表示したいと考えています (そのため、「優先度」について考えました)。

この巨大なテーブルは製品の編集に使用されるため、製品の属性に簡単にアクセスできるようにしたいと考えています (属性ごとに 1 つの列があります)。そのため、データベースへの要求を最小限に抑える必要があります。


私を助けてくれる人に感謝します!クルガル

4

2 に答える 2

8

重複を避けるために、これを試すことができます。

Product.joins(:categories).group("products.name").order("categories.priority ASC, products.name ASC")
于 2012-12-18T10:08:22.147 に答える
1

多分これを試してみてください

products = Product.joins(:categories).order("categories.priority ASC, products.name ASC")

これにより、重複した値も取得されます。名前を取得したいとしましょう。おそらくこれを試すことができます

products.map(&:name).uniq
于 2012-12-18T09:49:43.863 に答える