0

私は4つのモデルを持っています:、、、、Products(モデルVendorsに参加)。CategoriesCategoryProducts

  • ベンダーには多くの製品があります。
  • 製品はベンダーに属します。
  • 製品には多くのカテゴリーがあります。
  • ベンダーには、製品を通じて多くのカテゴリがあります。

これが私のモデルのセットアップ方法です。

Vendor.rb

class Vendor < ActiveRecord::Base

  attr_accessible :name, :description, :category_ids, :product_ids, :user_id

    has_many :products, :dependent => :destroy
    has_many :categories, :through => :products
    belongs_to :owner, :class_name => "User",
        :foreign_key => "user_id"   
end

Product.rb

class Product < ActiveRecord::Base
  attr_accessible :name, :description, :price, :vendor_id, :category_ids

    belongs_to :vendor
    has_many :category_products do
           def with_categories
             includes(:category)
           end
    end

    has_many :categories, :through => :category_products

end

Category.rb

class Category < ActiveRecord::Base
  attr_accessible :name, :product_ids, :category_ids
    has_many :category_products do
         def with_products
           includes(:product)
         end
       end

  has_many :products, :through => :category_products

end

の結合モデルProduct & Category

CategoryProduct.rb

class CategoryProduct < ActiveRecord::Base
  attr_accessible :product_id, :category_id, :purchases_count

    belongs_to :product
  belongs_to :category

  validates_uniqueness_of :product_id, :scope => :category_id
end

コマンドラインでベンダーのカテゴリを取得しようとすると、多くの重複した結果が返されます。これは主に、そのベンダーが所有する各製品のカテゴリを返すためです。

ここに例がありv = Vendor.firstます:

1.9.3p194 :008 > v.products.count
   (0.3ms)  SELECT COUNT(*) FROM "products" WHERE "products"."vendor_id" = 10
 => 8 
1.9.3p194 :009 > v.categories.count
   (0.3ms)  SELECT COUNT(*) FROM "categories" INNER JOIN "category_products" ON "categories"."id" = "category_products"."category_id" INNER JOIN "products" ON "category_products"."product_id" = "products"."id" WHERE "products"."vendor_id" = 10
 => 13 
1.9.3p194 :010 > Category.count
   (7.8ms)  SELECT COUNT(*) FROM "categories" 
 => 2 

一部の製品には複数のカテゴリがあります。そのため、との間に不一致がv.products.countありv.categories.countます。

v.categories.countカテゴリの一意の量(この場合、最大値は)を表示するにはどうすればよい2ですか?

ありがとう。

4

1 に答える 1

1

かなり簡単だと思います。uniq次の方法を使用してください。

v.categories.uniq.count

アソシエーションレベルで配置するには:uniq => true、次のオプションを使用できます。

has_many :categories, :uniq => true
于 2013-01-07T06:11:51.850 に答える