0

我有以下模型类:

class OptionCategory < ActiveRecord::Base
  attr_accessible :disabled, :list_index, :name
  has_many :options
end


class Option < ActiveRecord::Base
  attr_accessible :disabled, :name, :option_category_id
  belongs_to :option_category
  has_and_belongs_to_many :products
end


class Product < ActiveRecord::Base
  attr_accessible :annual_fee, :bal_transfer_intro_apr_end, :bal_transfer_intro_apr_start, :balance_transfer_fee, :description, :image, :image_cache, :name, :pur_intro_apr_end, :pur_intro_apr_start, :sign_up_bonus, :sign_up_bonus_type, :url
  mount_uploader :image, ImageUploader

  has_and_belongs_to_many :options
end

在我的一个控制器中,我收到一组选项 ID,我想查询具有与这些 ID 匹配的选项的产品。在 Rails 中有没有简单的方法来做到这一点?谢谢!

4

2 回答 2

1

您可以使用以下方法找到所有选项并优化 N+1 includes

Option.includes(:products).where(:id => array_of_ids)

这将执行单次select * from options where id in [array_of_ids]加载选项、提取product_id字段并执行单次附加select * from products where id in [product_ids]查询。

您可以使用has_many :through, 并创建一个模型来包装连接表,从而使自己更容易做到这一点。如果调用此模型ProductOptions,您将能够简单地执行以下操作:

Product.find(ProductOptions.where(:option_id => array_of_option_ids).map(&:product_id).uniq)
于 2012-08-20T21:03:52.003 回答
0
Product.joins(:options).where(:options => {:id => params[:options]}).group(:id)
于 2012-08-21T17:37:03.793 回答