2011-11-05 96 views
0

我將如何使用活動記錄在這種情況下:Rails的排除查詢與活動記錄 - Rails的3.1

我有兩個表:用戶,管理員

管理員可以爲用戶也因而有USER_ID在他們的桌子。

我想選擇沒有爲user_id的管理員表中設置

注意所有用戶:這只是一個例子情況。如果這是一個真實的案例,那麼我當然不會爲用戶和管理員提供兩個不同的表格。

編輯:再次,我知道這樣做的語義是這樣糟糕的db設計 - 但它只是一個虛擬的情況。

回答

1

您可以使用:conditions包括一個NOT IN

User.find(:all, :conditions => ['user_id not in (?)', @admins.map(&:id)]) 

OR,您可以在代碼轉換成用戶scope(又名named_scope前到Rails 3.X):

class User < ActiveRecord::Base 
    scope :not_admin, lambda { |admins| { :conditions => ['user_id not in (?)', admins.select(&:id).join(',')] } 
end 

並將其作爲:

User.not_admin(@admins) 

爲了不依賴於@admins變量傳遞你可以使用joinsOR

class User < ActiveRecord::Base 
    scope :not_admin, joins(:admin).where(:admins => { :user_id => nil }) 
end 
+0

有沒有一種辦法可以讓一個'scope'這樣我就可以把它放在模型而不是控制器? – Hopstream

+0

是的,這是在答案:) – tolitius

+0

似乎並沒有工作 - 我不斷收到一個錯誤的參數數量(0爲1)'錯誤 – Hopstream