2013-01-07 24 views
0

我有4種型號:ProductsVendorsCategoriesCategoryProducts(加入模式)。如何通過另一個模型設置has_many關係,但需要唯一性?

  • 一個供應商有很多產品。
  • 產品屬於供應商。
  • 產品有很多種類。
  • 供應商有許多類別的產品。

這是我的模型如何建立現在:

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.countv.categories.count之間的差異。

我如何獲得v.categories.count只顯示類別的唯一數量(在這種情況下,最大值是2)?

謝謝。

回答

1

我認爲這是相當簡單的。只需使用如下的uniq方法。

v.categories.uniq.count 

爲了把它放在關聯級別可以使用:uniq => true選項,如下所示。

has_many :categories, :uniq => true 
+0

嗯......我想在協會層面做到這一點。我不能那樣做嗎? – marcamillion

+0

完美。忘記那個標誌:) – marcamillion

相關問題