Ruby on rails 如何阻止ActiveRecord合并查询?

Ruby on rails 如何阻止ActiveRecord合并查询?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,除去不相关的部分,我有以下模型: class Member < ActiveRecord::Base attr_accessible :custom_fields_attributes has_many :custom_fields, :as => :custom_fieldable end class CustomField < ActiveRecord::Base attr_accessible :key_id, :value belongs_to :ke

除去不相关的部分,我有以下模型:

class Member < ActiveRecord::Base
  attr_accessible :custom_fields_attributes
  has_many :custom_fields, :as => :custom_fieldable
end

class CustomField < ActiveRecord::Base
  attr_accessible :key_id, :value
  belongs_to :key
  belongs_to :custom_fieldable, :polymorphic => true
end

class Key < ActiveRecord::Base
  attr_accessible :key
end
我如何运行一个查询来检索所有头发颜色为“棕色”且身高为“5英尺”的成员

我试着用两个连续的命令:

ms = Member.joins(:custom_fields).where("custom_fields.key_id = 1 AND custom_fields.value = 'Brown'")
ms.joins(:custom_fields).where("custom_fields.key_id = 2 AND custom_fields.value = '5ft'")
但是,这不起作用,因为ActiveRecord运行的第二个查询如下:

SELECT `members`.* FROM `members` INNER JOIN `custom_fields` ON
`custom_fields`.`custom_fieldable_id` = `members`.`id` AND
`custom_fields`.`custom_fieldable_type` = 'Member' WHERE
(custom_fields.key_id = 1 AND custom_fields.value = 'Brown') AND
(custom_fields.key_id = 2 AND custom_fields.value = '5ft')
上面的查询返回一个空记录,因为没有自定义字段可以同时包含两个内容

我想做的是让Rails计算第一个结果,然后对其运行第二个查询。我该怎么做


我使用的版本是Rails 3.2.14。

我想如果您想在一个查询中加入
自定义字段
表,您必须在其中一次(或两次)添加别名

比如:

Member
 .joins('custom_fields as custom_fields_1').where("custom_fields_1.key_id = 1 AND custom_fields_1.value = 'Brown'")
 .joins('custom_fields as custom_fields_2').where("custom_fields_2.key_id = 2 AND custom_fields_2.value = '5ft'")
或者,分别运行这两个查询,并合并结果。例如

brown_members = Member.joins(:custom_fields).where("custom_fields.key_id = 1 AND custom_fields.value = 'Brown'")
height_members = Member.joins(:custom_fields).where("custom_fields.key_id = 2 AND custom_fields.value = '5ft'")
ms = brown_members.merge(height_members)

我用它来定义ActiveAdmin的自定义过滤器,我不认为我可以在不投入大量工作的情况下分别运行这两个查询。不过,第一种方法非常有效。非常感谢。这就是说,我确实必须这样做一个显式联接(您的未能运行):Member.joins(“内部联接
自定义字段
作为
自定义字段
自定义字段
上的
自定义字段
=
成员
id
自定义字段
自定义字段
).where(“自定义字段\u 1.key\u id=1和自定义字段\u 1.value='Brown')。连接(“内部连接
custom\u字段
custom\u字段\u 2
ON
custom\u字段\u 2
自定义字段\u id
=
成员
id
自定义字段\u 2
自定义字段\u类型
='Member')。其中(“自定义_字段_2.key_id=2和自定义_字段_2.value='5ft')
brown_members = Member.joins(:custom_fields).where("custom_fields.key_id = 1 AND custom_fields.value = 'Brown'")
height_members = Member.joins(:custom_fields).where("custom_fields.key_id = 2 AND custom_fields.value = '5ft'")
ms = brown_members.merge(height_members)