0

私はそのようなクエリを持っています:

@users = User.where(:something => 'met')

これにより、1つ以上のアイテムを持つ@usersが返されます

私がやりたいのは、@ userオブジェクトをループして、条件が満たされているかどうかを確認することです。条件が満たされている場合は、オブジェクトからアイテムを削除します。私は以下を試しましたが、エラーは発生しませんが、機能していないようです。

@users.each_with_index do |u, index|
  @users.delete(index) if u.id == 12
end

これを機能させるためのより良い方法についての提案はありますか?

ありがとうございました

4

3 に答える 3

3

データベースから削除しますか、それともリストから削除しますか?

前者の場合、

@users.each do |u|
  u.delete if u.id == 12
end

後者では、

@users.reject! do |u|
  u.id == 12
end

または、条件が「true」/「false」のような値を返すユーザーのメソッドである場合、

@users.reject! &:is_12

class User < ActiveRecord::Base
  def is_12
    self.id == 12
  end
end
于 2012-10-01T03:43:35.527 に答える
0

Array#delete_if

@users.delete_if { |u| u.id == 12 }

クエリからまとめて除外することもできます。

User.where(:something => "met").where("id != ?", 12)

試行が機能しない理由はArray#delete、インデックスではなくオブジェクトを取得するためです。したがって、例を微調整する必要があります。

@users.each { |u| @users.delete(u) if u.id == 12 }

しかし、それは方法を考えるとばかげているようですdelete_if:)

于 2012-10-01T03:42:09.393 に答える
0

通常、問題のレコードをフェッチから除外することをお勧めします。

@users = User.where(:something => 'met').where('id!=?', 12)

それ以外の場合は、結果セットを操作する必要があります。これを行う簡単な方法は、それをハッシュに変換し、問題のあるキーを削除することです。

@users = Hash[User.where(...).collect { |u| [ u.id, u ] }]
@users.delete(12)
于 2012-10-01T03:47:38.287 に答える