1

私は次のものを持っています:

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

一致する User.all からすべてのレコードを除外したいと思いcurrent_user.manager_usersます。ポイントは、has_manyコレクションである manager_users 配列に既に追加されているユーザーが選択ボックスに表示されないようにすることです。

4

3 に答える 3

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)部分は、current_user にリンクされた manager_users のすべての client_ID を (DB レベルでのみ) 取得します。

お役に立てれば!

于 2013-05-21T01:43:04.153 に答える
1

NOT IN を含む回答は本質的に非効率的です。1 つしか必要としない 2 つのクエリを作成し、すべての ID をやり取りしているためです。

manager_users は User の自己結合であると推測しています。何かのようなもの:

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

別の角度からクエリに取り組み、 current_user.manager_users 関連付けの生成に使用されるものとは反対のロジックを適用する必要があります。次のようにします。

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

manager_id を、正しい結合列が DB にあるものに置き換えます。これが2 つのクエリを必要とする理由はありません。

于 2013-05-21T02:17:07.263 に答える
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、フォームで使用します。

于 2013-05-21T01:43:14.507 に答える