给定数据库中的Object,如何从对象中删除单个项目?

时间:2012-10-01 03:32:39

标签: ruby-on-rails ruby ruby-on-rails-3

我有这样的查询:

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

这会返回@users,包含1 +项

我想要做的是循环@user对象以查看是否满足条件,如果满足条件我想从对象中删除该项。我一直在尝试以下但它似乎不起作用,虽然没有错误。

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

关于更好地实现这项工作的建议?

谢谢

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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方法,这似乎很愚蠢:)

答案 2 :(得分:0)

通常最好从您的提取中排除相关记录:

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

否则你必须操纵结果集。一种简单的方法是将其转换为哈希并删除有问题的密钥:

@users = Hash[User.where(...).collect { |u| [ u.id, u ] }]
@users.delete(12)