Rails,ActiveRecord,多个where嵌套属性的语句

时间:2014-06-04 09:51:38

标签: mysql ruby-on-rails activerecord many-to-many nested-attributes

我的Rails / ActiveRecord中的MySQL查询有问题。

首先,我的数据模型:

class Product < ActiveRecord::Base
  has_many :product_answers, dependent: :destroy
  has_many :answers, :through => :product_answers
end

class ProductAnswer < ActiveRecord::Base
  belongs_to :product
  belongs_to :answer

  attr_accessible :answer_id, :product_id
end

class Answer < ActiveRecord::Base
  has_many :product_answers, dependent: :destroy
  has_many :products, :through => :product_answers
end

现在我的搜索查询存在问题:

例如,我有两个产品:

Product1:包括answer.id = 13和answer.id = 25 Product2:包括answer.id = 14和answer.id = 89

现在我的第一个查询如下:

Product.joins(:answers).where("answers.id" => [13,14])
=> [Product1, Product2]

我需要按所有产品过滤此查询及其答案,包括[13,4]和[25]中answers.ids的组合

在逻辑形式中,我需要这样的东西:

where (answers.id = 13 and answers.id = 25) or (answers.id = 14 and answers.id = 25) 

我的第一个想法是这样的。

Product.joins(:answers)where("answers.id" => [13,14]).where("answers.id" => 25)

但这不起作用。

有没有好的解决方案,不进行单独的查询然后组合它们?

由于

编辑:

好的,我有一个结合多个查询的解决方案。

sub_answers = [[13,14], [25]]
  pre_product_list = nil
  sub_answers.each do |sub_answer|
    if pre_product_list.nil?
      pre_product_list = Product.joins(:product_answers).where('product_answers.answer_id' => answers).group("id").map{ |pa| pa.id }
    else
      pre_product_list = Product.joins(:product_answers).where('product_answers.product_id' => pre_product_list, 'product_answers.answer_id' => answers).group("id").map{ |pa| pa.id }
    end
  end
end

有人可能有更好的解决方案吗?我期待着进一步的建议。

0 个答案:

没有答案