我有以下内容:
= 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
集合。
答案 0 :(得分: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。
希望这有帮助!
答案 1 :(得分: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
。
答案 2 :(得分:1)
涉及NOT IN的答案本质上是低效的,因为您只需要1来进行2次查询,并且来回传递所有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次查询。