2013-05-21 16 views
1

我有以下幾點:如何用ActiveRecord排除一系列記錄?

= select :client, :id, User.all.map {|u| [u.username, u.id]}, include_blank: "Add a client by username" 

我想排除User.all匹配current_user.manager_users的所有記錄。重點是,選擇框不會顯示已添加到manager_users數組中的用戶,該數組是has_many集合。

回答

4

你可以這樣做:

= select :client, :id, User.where("users.id NOT IN (?)", current_user.manager_users.pluck(:client_id)).map {|u| [u.username, u.id]}, include_blank: "Add a client by username" 

新的東西是在這裏:

User.where("users.id NOT IN (?)", current_user.manager_users.pluck(:client_id)) 
    .map{ |u| [u.username, u.id] } 

current_user.manager_users.pluck(:client_id)部分將檢索(僅在DB級)連接到manager_users的所有client_IDs current_user。

希望這會有所幫助!

+0

PGError:ERROR:列引用 「ID」 是不明確的 LINE 1:SELECT ID FROM 「用戶」 INNER JOIN 「經理人」 ON 「用戶」, 「ID」 ...... ^ :SELECT ID從 「用戶」 INNER JOIN「managers」ON「users」。「id」=「managers」。「user_id」WHERE「managers」。「client_id」= 1 –

+0

謝謝.... –

+0

has_many:managers,:foreign_key =>:client_id has_many:manager_users,:through =>:managers,:source =>:用戶 has_many:clients,:class_name =>「Manager」 has_many:client_users,:through =>:clients,:source =>:client –

1

你可以這樣做:

# in your controller 
ids = current_user.manager_users.pluck(:id) 
@users = User.where("id not in (?)", ids).map { |u| [u.username, u.id] } 

然後在表單中使用@users

+0

啊哈,你遲到了11秒! – MrYoshiji

+0

哈哈,差不多:) –

1

涉及NOT IN的答案本質上是效率低下的,因爲您在2個查詢中只需要1個,並將所有ID來回傳遞。

我猜manager_users是用戶自我加入。喜歡的東西:

has_many :manager_users, class_name: User, foreign_key: :manager_id 

你需要來從另一個角度查詢和公正適用相反的邏輯是什麼用於生成current_user.manager_users關聯。做類似的事情:

User.where("manager_id <> ?", current_user.id) 

將manager_id替換爲數據庫中正確的連接列。有沒有理由這應該需要2個查詢

+0

manager_users是一個基於Manager類的獨立類。has_many:managers,:foreign_key =>:client_id has_many:manager_users,:through =>:managers,:source =>:user has_many:clients,::class_name =>「Manager」has_many:client_users,:through =>:clients,:來源=>:clien –

+0

@DanielFischer你會介意在你的問題中發佈基本的模型關係?評論中很難說清楚。 – jshkol

+0

在這裏你去:謝謝你:https://gist.github.com/dfischer/146575b302d4517ec7f2 –

相關問題