2011-03-12 118 views
1

我有HABTM關係用戶和相冊模式Rails的HABTM查詢WHERE條件基於關聯屬性

class Album < ActiveRecord::Base 
    has_and_belongs_to_many :users 

class User < ActiveRecord::Base 
    has_and_belongs_to_many(:albums) 

我想找到的所有存儲在數據庫中,但不與特定相關的相冊用戶。

到目前爲止,我的代碼是這樣的:

Album.all(:order => "albums.created_at DESC", :include => "users", :limit => limit, :conditions => ["users.id != ? AND users.id IS NOT NULL", current_user.id])

,但由於某種原因,這是行不通的。它返回與current_user關聯的相冊。

這裏來看看這個從控制檯ouptput。 檢查用戶ID我第一次獲取。 然後,我找到的專輯不應該有用戶ID 然後我找到一個列出的專輯,並要求它返回相關用戶 其中一個關聯用戶是上面的一個,不應該在那裏。 enter image description here

任何人都可以幫助上述嗎?

回答

7

我通常會盡量遠離子選擇,但我似乎無法得到它的工作任何其他方式:

class Album < ActiveRecord::Base 

    scope :without_user, lambda{|u| where("#{quoted_table_name}.id NOT IN (SELECT `albums_users`.album_id FROM `albums_users` WHERE `albums_users`.user_id = ?)", u.id) } 

end 

user = User.find(30) 
Album.without_user(user) 
+0

@robodisco:這不適合你嗎?這裏有不清楚的地方嗎? Imho這是最好的答案。 – nathanvda 2011-03-20 19:16:11

+3

對於遲到的回覆感到抱歉 - 我住在日本,最近的地震和輻射恐懼有點破壞性。感謝您的幫助。我已經把你的標記作爲選擇的答案 - 我假設你的獎金是你的,儘管我確定我指定了50而不是顯示的25。 – robodisco 2011-03-26 07:37:32

+0

quoted_table_name還指什麼? – robodisco 2011-03-26 07:37:55

1

嘗試:

:conditions => ["users.id <> ? AND users.id IS NOT NULL", current_user.id] 
+0

感謝您的幫助。不幸的是沒有運氣,這並沒有改變結果。它仍然返回一些相冊,當我檢查他們的關聯用戶時,current_user出現。 – robodisco 2011-03-12 10:37:02

2

假設你創建的表albums_users持有關係數據:

Album.includes(:users). 
    where(["albums_users.user_id IS NULL OR albums_users.user_id != ?", user_id]) 

我認爲這將產生沿

SELECT * 
FROM albums LEFT OUTER JOIN albums_users ON albums.id = albums_users.album_id 
WHERE albums_users.album_id IS NULL OR albums_users.album_id != #{user_id} 
+0

感謝您的回覆,但這並不適合我。 – robodisco 2011-03-26 07:38:18

-1

一個非行SQL sql解決方案將是:

Album.all.reject{|album| user.albums.include?(album)} 

顯然,如果你的數據庫中有成千上萬行,你可能不想這樣做。

可能會做這樣的事情,太:

Album.where(["id NOT IN (?)", user.albums_ids]) 

但是如果你的用戶有專輯的很多(說上百個),你不應該這樣做無論是。

只要投入簡單的解決方案,如果你出去的人之一。

+0

是的,他們是很好的簡單的解決方案,我會爲他們爲v1,但正如你所說那裏不是很大,當有很多行,這是真的在我的情況。 – robodisco 2011-03-26 07:39:40

+0

效率不高 – 2013-06-07 16:09:51