我有以下幾點:如何用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
集合。
我有以下幾點:如何用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
集合。
你可以這樣做:
= 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。
希望這會有所幫助!
你可以這樣做:
# in your controller
ids = current_user.manager_users.pluck(:id)
@users = User.where("id not in (?)", ids).map { |u| [u.username, u.id] }
然後在表單中使用@users
。
啊哈,你遲到了11秒! – MrYoshiji
哈哈,差不多:) –
涉及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個查詢。
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 –
@DanielFischer你會介意在你的問題中發佈基本的模型關係?評論中很難說清楚。 – jshkol
在這裏你去:謝謝你:https://gist.github.com/dfischer/146575b302d4517ec7f2 –
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 –
謝謝.... –
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 –