【问题标题】:Need simple Rails many to many association logic需要简单的 Rails 多对多关联逻辑
【发布时间】:2016-10-27 10:36:47
【问题描述】:

我有一个产品列表和一个类别列表。另外我有一个映射表product_categories,它告诉产品属于不同的类别,并且类别有很多产品。这里的类别列表由管理员定义。类别的数量是固定的,但可以变化。现在我需要获取与类别映射的产品列表

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

有什么办法可以简化这条线?

【问题讨论】:

  • 您是否需要包含至少一种产品(如您的代码中)、按类别计算的产品数量或产品本身在类别中的类别列表?
  • 是的,我需要包含至少一种产品的类别列表。不算数。我需要整个记录@Vasfed

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord


【解决方案1】:

要获取包含产品的类别列表,您可以使用 SQL inner join,这是 rails 中的默认设置。

Category.joins(:product_categories).distinct

【讨论】:

  • 我认为这会加快执行速度,因为它使用两个连接("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'")
【解决方案2】:

试试这个,

Category.joins(:products).distinct

【讨论】:

  • 执行比 'Category.joins(:products).distinct' 花费更多时间。我已经检查了两个执行时间。对于“Category.joins(:products).distinct”,它需要 5 毫秒,而对于您的查询,它需要 9 毫秒。如果可以进一步减少执行时间可能会更好。
  • 你想说什么?? Category.joins(:products).distinct 花费的时间更多还是更少??
  • 需要更多时间。
猜你喜欢
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多