0
剔除不相關的部分,我有以下型號:如何停止合併查詢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 :key
belongs_to :custom_fieldable, :polymorphic => true
end
class Key < ActiveRecord::Base
attr_accessible :key
end
假設我有我的keys
表中的兩個條目:
---------------
id | key
---+-----------
1 | Hair color
2 | Height
我怎麼運行一個查詢,將讓我取回所有有「棕色」頭髮顏色和「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。
我正在使用它來爲ActiveAdmin定義自定義過濾器,並且我不認爲我可以單獨運行這兩個查詢而不需要進行大量工作。不過,第一種方法很好。謝謝! –
也就是說,我確實必須做一個明確的連接(你的失敗):Member.joins(「INNER JOIN'custom_fields' as'custom_fields_1' ON 'custom_fields_1'.'custom_fieldable_id' ='members'.' id' AND 'custom_fields_1'.'custom_fieldable_type' ='Member'「)。where(」custom_fields_1.key_id = 1 AND custom_fields_1.value ='Brown'「)。join(」INNER JOIN'custom_fields' as'custom_fields_2' ON (custom_fields_2.key_id = 2 AND custom_fields_2.value ='5ft'「) –