2014-03-07 49 views
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。

回答

1

如果您想在一個查詢中執行此操作,我懷疑您將不得不別名您加入custom_fields表的一個(或兩個)時間。

喜歡的東西:

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) 
+0

我正在使用它來爲ActiveAdmin定義自定義過濾器,並且我不認爲我可以單獨運行這兩個查詢而不需要進行大量工作。不過,第一種方法很好。謝謝! –

+0

也就是說,我確實必須做一個明確的連接(你的失敗):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'「) –