仅从内存中删除而不是从数据库中删

时间:2009-03-10 17:11:33

标签: ruby-on-rails activerecord

我有一个包含商店列表的ActiveRecord数组。

shops = Shop.find(:all)

我想从商店删除记录而不从数据库中删除它。

shops.delete(a_shop)会导致删除SQL查询。我只想将商店从ActiveRecord数组中删除,而不是从数据库中删除。

可以这样做吗?

由于

4 个答案:

答案 0 :(得分:9)

小心如果您使用has_many关系,则JP的答案将无效。

扩展示例:

class City < ActiveRecord::Base
  has_many :shops
end

city = City.find(:name => "Portland")

然后

city.shops.delete(city.shops[0])

从数据库中删除!

另外

theshops = city.shops
theshops.delete(ss[0])

将从数据库中删除

从DB分离的一种方法是使用紧凑或其他数组函数,如下所示:

theshops = city.shops.compact
theshops.delete(ss[0])

不会从数据库中删除

此外,在所有情况下,delete_if 将不会从db:

中删除
city.shops.delete_if {|s| s.id == city.shops[0]}

干杯!

不要忘记:如果您对这些事情有疑问,脚本/控制台就是您的朋友!

答案 1 :(得分:5)

当我进行一些测试时,调用delete方法实际上并不会从数据库中删除该元素。仅来自阵列。

shops = Shop.find(:all)
shops.delete(shops[0]) #deletes the first item from the array, not from the DB

要从数据库中删除:

shops = Shop.find(:all)
Shop.delete(shops[0].id)

看到区别?至少,这是如何在我的Rails 2.1设置上工作。

-jP

答案 2 :(得分:1)

我认为你不能从数组中删除该项目。

但是,您应该能够修改您的查找以在最初没有该商店的情况下返回该数组。类似的东西:

shops = Shop.find(:all, :conditions => "id NOT #{a_shop.id}")

应该符合您的要求。这样你就不会首先在容器中获得商店,但它不会影响数据库。

答案 3 :(得分:0)

我想建议删除内存中的AR对象 将属性添加到负责将AR对象标记为已删除的相应模型(例如deleted属性):

class OrderItem&lt;的ActiveRecord :: Base的      ...      attr_accessor:已删除

 def deleted
   @deleted || 'no'
 end

将相应的对象标记为已删除:

o.order_items {|oi| oi.deleted = 'yes' if oi.id == 1029}

过滤order_items只设置未删除的行:

o.order_items do |oi| 
 unless oi.deleted == 'yes'
 ...
 end
end