2013-03-15 43 views
1

我試圖從A返回所有匹配記錄滿足條件的記錄。目前,我的查詢返回來自A的記錄,其中有來自B的任何滿足條件的記錄。讓我把它放到真實世界的場景中。條件適用於所有加入記錄

Post.joins(:categories) 
    .where(:categories => { :type => "foo" }) 

這將返回Post S作類型爲「富」的範疇,我要的是Post(胡)的類別都是類型的「富」的!

幫助感謝!

+0

您的查詢應該可以正常工作。你是什​​麼意思**所有類型的「富」!**。 – shweta 2013-03-15 12:40:08

+0

那麼,它會返回具有任何類型foo的帖子。如果一篇文章有​​5個類別,並且它們不是foo類型的,我不希望它們返回它們。 – 2013-03-15 12:56:44

回答

2

使用您的db/schema.rb,張貼在#rubyonrails在IRC上是這樣的:

Incident.select("incidents.id"). 
joins("INNER JOIN category_incidents ON category_incidents.incident_id = incidents.id"). 
joins("INNER JOIN category_marks ON category_marks.category_id = category_incidents.category_id"). 
where(:category_marks => { :user_group_id => current_user.user_group_id }). 
group("incidents.id"). 
having("SUM(CASE WHEN category_marks.inc = 1 THEN 1 ELSE 0 END) = count(category_indicents.incident_id)") 

會做的伎倆。

它加入current_user的category_marks並檢查.inc = 1的記錄數是否等於所有連接記錄的計數。

請注意,這隻提取incident.id

+1

好的!Muchas gracias,正如他們在西班牙說..可能。 – 2013-03-15 13:11:07

1

我會在此查詢的末尾添加一個select來檢查所有類別是否都有類型foo。我還會通過向類別模型添加實例方法來簡化該檢查。

Post.joins(:categories).select{|p| p.categories.all?(&:type_foo?)} 

類別型號

def type_foo? 
    type == "foo" 
end 

增加:這是一個有點「哈克」,但你可以把它的作用域這種方式。

class Post < ActiveRecord::Base 
    scope :category_type_foo, lambda{ 
    post_ids = Post.all.collect{|p| p.id if p.categories.all?(&:type_foo?).compact 
    Post.where(id: post_ids) } 
end 
+0

這將是偉大的,但我需要返回一個範圍/關係! :( – 2013-03-15 12:55:38

0

你試過在相反的方向查詢嗎?即

Categories.where(type: 'foo').joins(:posts) 

雖然我可能誤解了你的問題。

另一種方法是

Post.joins(:classifications).where(type: 'foo') 
+0

在相反方向的查詢仍然會返回任何職位與類型foo的類別,不一定是所有類型的職位foo。 – 2013-03-15 12:42:34