24

我在数组中有一组活动记录对象。

我只想从不在数据库中的数组中删除对象

a = Model.limit(2)

b = Model.first

a.delete(b)

返回零值

它没有删除

反正有吗?

4

3 回答 3

29
a.to_a - [b]

背景:a.to_a将关系转换为内存中的数组。
[b]是一个数组,仅包含要删除的元素(在内存中)。
a.to_a - [b]进行数组减法。

(在 Rails 3.2 中,.to_a 在访问时自动应用于关系。我同意gregates:最好将关系显式转换为数组)

于 2013-06-02T15:05:30.083 回答
15

这里可能存在一些混淆,因为 in ActiveRecord,Model.limit(2)不返回数组。

Model.limit(2).class #=> ActiveRecordRelation

所以当你打电话时a.delete(b),你可能不会打电话Array#delete

试试这个:

a = Model.limit(2).to_a # Executes the query and returns an array
b = Model.first
a.delete(b)
于 2013-06-02T15:01:59.953 回答
4

这就是你需要的:

objects_in_db = Model.all
objects_in_array = Model.first(2)
objects_in_array.delete_if { |obj| !objects_in_db.include?(obj)}

在您的情况下,Model.limit(2)可能不会返回前两个对象,因此数组a可能不包含b,因此返回nil.

于 2013-06-02T14:47:19.650 回答