0

我有一个下拉表单,它显示了我的用户数据库表中的所有电子邮件。

  <%= f.collection_select(:accessor_id, User.all,:email ,:email) %>

我想从这个列表中排除当前用户电子邮件的值,我可以用 with current_user.email(already defined and working)找到它

我知道我可以通过以下查询来实现这一点:

  <%= f.collection_select(:accessor_id, User.select(:email).where("email !=?" , current_user.email),:email ,:email) %>

我想知道在 User.all 返回所有值之后是否可以这样做。

4

2 回答 2

3

你的意思是

User.all.reject {|user| user == current_user}

或者更准确地说,我会在控制器的某个地方获取所有用户

def index
  @users = User.all
end

并在表格中使用类似的东西

<%= f.collection_select(:accessor_id, @users.reject {|user| user == current_user}.map(&:email)) %>
于 2013-10-13T14:29:23.440 回答
3

@phoet 答案是正确的,就个人而言,无论如何我可能会在数据库级别执行此操作,类似于

class User < ActiveRecord::Base
  # ...

  def self.all_without(excluded)
    where("id NOT IN (?)", excluded)
  end
end


<%= f.collection_select(:accessor_id, User.all_without([current_user]), :email ,:email) %>

如果可能的话,尽量保持视图“干净”的细节

# and if you really do only want to pull email from the database, you can chain the query
User.all_without([current_user]).select(:email)
于 2013-10-13T14:35:15.957 回答