2012-01-21 10 views
0

내 문제는 다소 단순해야하지만 이해하지 못했습니다. 예를 들어객체 배열에서 객체 제거

나는 데이터베이스에서 다음 데이터가 : 다음

@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) 메소드는 데이터베이스에서 사용자,하지만 난 그냥 @ 사용자 배열에서 개체를 제거하려면.

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

그것은 더 간단하고, 단지 배열에서 제거, 데이터베이스의 제거하지 않았다

+0

@user가 배열이 아닌 .. 그것을 확인하기 위해 수집하지만, 액티브 모음입니다. 당신은 그것을 반복 할 수 있고 배열처럼 느껴질 수있는 것들을 쌓을 수 있습니다. 그것을 배열로 생각하지 마십시오. 그것은 너의 마음을 아프게 할 것이다. – baash05

답변

0

당신은 당신이 사용할 수있는 바이스 반대를

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 
0

을 할 수 있습니다. =)

0

싼 방법으로 이동하는 방법 ... Less work .. 알고있는 이메일 주소의 배열을 만들고 더 이상 필요가 없습니다.

other_emails = @other_user.map{|o| sanitize(o["email"]) } 
@users = User.where("email not in ( #{other_emails.join(',')} )") 

이 접근 방식에는 많은 장점이 있습니다.

  1. 하나의 루프 (맵)가 있으며 포함되지 않습니다.
  2. 하나의 배열 크기 조정 (지도)이 있습니다. 우리는 배열에서 무거운 연산 인 delete를 호출하지 않습니다.
  3. 우리는 신경 쓰이는 네트워크를 통해서만 레코드를받습니다. 당신이 한줌 만 돌 보았을 때 1 백만 레코드를 꺼내는 것은 바보입니다. 당신이 필요로하는 것만 DB에서 읽으려고 노력하십시오.

경우에 따라 데이터베이스를 작동시키는 것이 더 똑똑합니다.

0

난 당신이 그냥 @의 user.email를 사용할 필요가 없습니다 생각 :

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