如何从数组中删除活动记录对象

时间:2013-06-02 14:30:32

标签: ruby-on-rails ruby

我在数组中设置了活动记录对象。

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

a = Model.limit(2)

b = Model.first

a.delete(b)

返回零值

不删除

还有吗?

3 个答案:

答案 0 :(得分:27)

a.to_a - [b]

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

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

答案 1 :(得分:14)

这里可能存在一些混淆,因为在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)

答案 2 :(得分:1)

这就是你需要的:

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