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
ONcustom\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)