我有这样的查询:
@users = User.where(:something => 'met')
这会返回@users,包含1 +项
我想要做的是循环@user对象以查看是否满足条件,如果满足条件我想从对象中删除该项。我一直在尝试以下但它似乎不起作用,虽然没有错误。
@users.each_with_index do |u, index|
@users.delete(index) if u.id == 12
end
关于更好地实现这项工作的建议?
谢谢
答案 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)
@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)