Arrays 从对象数组中删除对象

Arrays 从对象数组中删除对象,arrays,ruby-on-rails-3,Arrays,Ruby On Rails 3,我的问题应该很简单,但我不明白 例如,我从数据库中获得以下数据: @user = User.all 然后我有另一个用户数组 other_user = getting_them_from_somewhere_else 现在,我迭代这两个数组,通过检查电子邮件来检查数据库中是否还有一些用户: @other_user.each do |o| @user.each do |u| if o["email"] == u["user_mail"] @user

我的问题应该很简单,但我不明白

例如,我从数据库中获得以下数据:

@user = User.all
然后我有另一个用户数组

other_user = getting_them_from_somewhere_else
现在,我迭代这两个数组,通过检查电子邮件来检查数据库中是否还有一些用户:

@other_user.each do |o|
    @user.each do |u|
        if o["email"] == u["user_mail"]
            @user.delete(u)
            break
        end
    end

    ... do something with o ...
end
@user.delete(u)方法从数据库中删除用户,但我只想从数组@user中删除对象u。

你可以这样做,反之亦然

result_users = []
@other_user.each do |o|
    @user.each do |u|
        if o["email"] != u["user_mail"]
            result_users << u
        end
    end

    ... do something with o ...
end
here you should use result_users array which has the users you need
result\u用户=[]
@其他用户。每个用户都可以|
@user.each do|u|
如果o[“电子邮件”]!=u[“用户邮件”]
结果用户您可以使用:

@other_user.each do |o|
   @user.delete_if{|u| u["email"] == o["email"]}
end

它更简单,没有删除数据库,只在数组中删除。=)

走便宜一点的路怎么样。。。减少工作量。。 创建一个你们知道的、不再需要的电子邮件地址数组

other_emails = @other_user.map{|o| sanitize(o["email"]) }
@users = User.where("email not in (  #{other_emails.join(',')}  )")
这种方法有很多优点

  • 只有一个循环(地图),没有嵌入任何内容
  • 只有一个数组可以调整大小(贴图)。我们不调用delete,这是对数组的一项繁重操作
  • 我们只通过网络获取我们关心的记录。当你只关心一小部分的时候,却要毁掉一百万张唱片是愚蠢的。尽量只从数据库中读取您需要的内容
    有时候,让数据库做事情更明智

    我想你不需要使用@user.email,只要:

      @users.delete_if {|user| @other_user.include? user}
    

    @用户不是数组。。这当然是一个集合,但也是一个activerecord集合。您可以遍历它,然后做一堆感觉像数组的事情。不要把它看作一个数组。这会让你心碎的。