2011-02-26 40 views
0

負條件的連接操作我有兩個型號:做與Rails的

class Member < ActiveRecord::Base 
    has_many :member_tags 
end 

class MemberTag < ActiveRecord::Base 
    belongs_to :member 
    # has a column 'tag' 
end 

我想執行以下連接: Member.all(:加入=> :member_tags,:conditions =>「所有沒有member_tag且標籤=」hidden「的成員

我該怎麼做?我想這是更多一個SQL的問題,不是一個軌道的一個:)

+0

雖然這個答案在SQL(左連接和檢查空,或者寫一個'不IN'子查詢)簡單,我不知道如何來表達它的ActiveRecord你的語法。 – 2011-02-26 09:22:00

+0

你能幫我解決這個問題嗎?我的SQL技能很糟糕 – MikeMarsian 2011-03-02 14:02:44

回答

1
SQL查詢

我認爲這可能做的伎倆:

select `members`.* 
from `members` 
LEFT JOIN `member_tags` 
ON `members`.id = `member_tags`.member_id 
where `members`.id NOT IN (select `members`.id 
from `members` 
LEFT JOIN `member_tags` 
ON `members`.id = `member_tags`.member_id 
where `member_tags`.tag = 'hidden' 
); 
+0

這看起來不錯,thanx男人。 – MikeMarsian 2011-03-17 15:26:10

0

我不能想出更好的東西,這是做的一個醜陋的方法,因爲它觸發(N + 1)n個成員

Member.all.select {|member| !(member.member_tags.map(&:tag).include? "hidden")} 
+0

這似乎返回所有標籤不是「隱藏」的成員。相反,我希望所有沒有這個標籤的成員。 – MikeMarsian 2011-02-26 11:33:26

+0

@麥克風..我已經編輯了答案,但我不會推薦它。 – rubyprince 2011-02-27 13:05:01