1

我的問題很相似,這個問題:Want to find records with no associated records in Rails 3查找無關聯的所有記錄與某一個領域

但與一捻。讓我們用他們的例子,並添加我的問題:

class Person 
    has_many :friends 
end 

class Friend 
    belongs_to :person 
    attr_accessor :type # this can be 'best' or 'acquaintance' 
end 

我想讓沒有'最好'朋友的所有人。我看到的大多數情況下的正常查詢是讓沒有任何朋友的人。這將是:

Person.includes(:friends).where(:friends => { :person_id => nil }) 

但這不是我想要的。有沒有辦法讓所有沒有「最好」朋友的人不管他們有多少其他類型的朋友?

回答

0

如果您正在使用支持上查詢否定軌4.2,你可以這樣做:

Person.includes(:friends).where.not(friends: { type: "best" }) 

在任何其他情況下:

Person.includes(:friends).where("friends.type != 'best'") 

更新

也許有點有點偏離主題,但你可以考慮使用活動記錄中的enum,以便映射這些類型的內容,如:

class Friend 
    belongs_to :person 
    enum type: {best: 0, acquaintance: 1} 
end 

然後,你可以查詢這樣的:

Person.includes(:friends).where.not(friends: { type: Friend.types[:best] }) 

這使得它更具可讀性,紅寶石友好和使用字符串,因爲該值存儲在數據庫的整數避免。

0

最簡單的,但不是唯一的,也不一定是最高效的,方式做到這一點是一個NOT EXISTS子查詢:

Person.where('NOT EXISTS(SELECT 1 FROM friends WHERE person_id=persons.id AND type=?)', 'best') 

您可以將此定義爲簡單的組成上Person一個範圍。注意:我也想指出,雖然Gustavo的解決方案如你所期望的那樣,但它會返回任何擁有不是他們最好的朋友的朋友(不只是沒有任何好朋友的人)的任何人。這是由於SQL的where子句如何在每行上起作用,並且無法在組或一對多關係上聲明。

相關問題