我試圖從A返回所有匹配記錄滿足條件的記錄。目前,我的查詢返回來自A的記錄,其中有來自B的任何滿足條件的記錄。讓我把它放到真實世界的場景中。條件適用於所有加入記錄
Post.joins(:categories)
.where(:categories => { :type => "foo" })
這將返回Post
S作類型爲「富」的範疇,我要的是Post
(胡)的類別都是類型的「富」的!
幫助感謝!
我試圖從A返回所有匹配記錄滿足條件的記錄。目前,我的查詢返回來自A的記錄,其中有來自B的任何滿足條件的記錄。讓我把它放到真實世界的場景中。條件適用於所有加入記錄
Post.joins(:categories)
.where(:categories => { :type => "foo" })
這將返回Post
S作類型爲「富」的範疇,我要的是Post
(胡)的類別都是類型的「富」的!
幫助感謝!
使用您的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
好的!Muchas gracias,正如他們在西班牙說..可能。 – 2013-03-15 13:11:07
我會在此查詢的末尾添加一個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
這將是偉大的,但我需要返回一個範圍/關係! :( – 2013-03-15 12:55:38
你試過在相反的方向查詢嗎?即
Categories.where(type: 'foo').joins(:posts)
雖然我可能誤解了你的問題。
另一種方法是
Post.joins(:classifications).where(type: 'foo')
在相反方向的查詢仍然會返回任何職位與類型foo的類別,不一定是所有類型的職位foo。 – 2013-03-15 12:42:34
您的查詢應該可以正常工作。你是什麼意思**所有類型的「富」!**。 – shweta 2013-03-15 12:40:08
那麼,它會返回具有任何類型foo的帖子。如果一篇文章有5個類別,並且它們不是foo類型的,我不希望它們返回它們。 – 2013-03-15 12:56:44