2016-10-27 88 views
2

我有一個產品列表和一個類別列表。另外我有一個映射表product_categories,它告訴產品屬於不同的類別,同時類別也有許多產品。這裏的類別列表是由admin定義的。類別的數量是固定的,但可以變化。現在,我需要得到其分別對應與類別需要簡單的Rails多對多的關聯邏輯

product.rb 
has_many :product_categories, dependent: :destroy 
has_many :categories, through: :product_categories 

category.rb 
has_many :product_categories 
has_many :products, :through => :product_categories 

product_category.rb 
belongs_to :product 
belongs_to :category 

我已經寫了代碼的產品列表:

ProductCategory.joins(:category).map(&:category).uniq 

有什麼辦法來簡化這一行?

+0

您是否需要一個類別列表,它至少包含一個產品(如代碼中),產品按類別或產品本身的類別? – Vasfed

+0

是的,我需要包含至少一種產品的類別列表。不是數量。我需要整個記錄@Vasfed –

回答

1

要獲得對我們的產品,你可以使用SQL inner join,這是在軌道默認的類別列表。

Category.joins(:product_categories).distinct 
+0

我認爲這會加速執行,因爲它使用兩個連接'(「SELECT DISTINCT'categories'。* FROM'categories'INNER JOIN'product_categories'ON'product_categories'。'category_id'='categories'。'id'INNER JOIN'domains'ON'domains'。'id'='product_categories'。'product_id'「)',而前一個只使用一個連接'(」SELECT DISTINCT'categories'。* FROM'categories'INNER JOIN'product_categories 'ON'product_categories'。'category_id'='categories'。'id'「)' –

1

試試這個,

Category.joins(:products).distinct 
+0

執行需要比'Category.joins(:products).distinct'更多的時間。我已經檢查了兩個執行時間。對於'Category.joins(:products).distinct',它需要5ms,對於您的查詢,它需要9ms。如果可以更多地減少執行時間,可能會更好。 –

+0

你想說什麼? Category.joins(:產品).distinct花費的時間或更少? – APS

+0

它需要更多時間。 –