如何使用ActiveRecord排除记录集合?

时间:2013-05-21 01:38:00

标签: ruby-on-rails 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集合。

3 个答案:

答案 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次查询