3 回答

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超11個(gè)贊
這仍然非常接近SQL,但它應(yīng)該讓所有人在第一種情況下沒(méi)有朋友:
Person.where('id NOT IN (SELECT DISTINCT(person_id) FROM friends)')

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊
更好:
Person.includes(:friends).where( :friends => { :person_id => nil } )
對(duì)于hmt它基本上是一樣的,你依賴的事實(shí)是沒(méi)有朋友的人也沒(méi)有聯(lián)系人:
Person.includes(:contacts).where( :contacts => { :person_id => nil } )
更新
has_one
在評(píng)論中有一個(gè)問(wèn)題,所以只是更新。這里的技巧是includes()
期望關(guān)聯(lián)的名稱,但where
期望表的名稱。對(duì)于一個(gè)has_one
關(guān)聯(lián)通常會(huì)以單數(shù)表示,以便更改,但該where()
部分保持不變。所以如果Person
只有has_one :contact
你的陳述是:
Person.includes(:contact).where( :contacts => { :person_id => nil } )
更新2
有人詢問(wèn)反向,沒(méi)有人的朋友。正如我在下面評(píng)論的那樣,這實(shí)際上讓我意識(shí)到最后一個(gè)字段(上面的:person_id
:)實(shí)際上并不需要與你返回的模型相關(guān),它只需要是連接表中的一個(gè)字段。他們都將是nil
如此,它可以是任何一個(gè)。這導(dǎo)致了上述更簡(jiǎn)單的解決方案:
Person.includes(:contacts).where( :contacts => { :id => nil } )
然后切換這個(gè)以返回沒(méi)有人的朋友變得更簡(jiǎn)單,你只改變前面的班級(jí):
Friend.includes(:contacts).where( :contacts => { :id => nil } )
更新3 - Rails 5
感謝@Anson提供優(yōu)秀的Rails 5解決方案(下面給出他的答案為+ 1),您可以使用left_outer_joins
以避免加載關(guān)聯(lián):
Person.left_outer_joins(:contacts).where( contacts: { id: nil } )
我把它包括在這里,所以人們會(huì)找到它,但他應(yīng)該得到+ 1s。太棒了!
- 3 回答
- 0 關(guān)注
- 730 瀏覽
添加回答
舉報(bào)