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”-ish 值的某种方法,

@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 }

You can also exclude it from the query all together:

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

The reason your try isn't working is because Array#delete takes an object, not an index. So you'd have to tweak your example:

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

But that seems silly given the delete_if method :)

于 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 回答