我有一个包含商店列表的ActiveRecord数组。
shops = Shop.find(:all)
我想从商店删除记录而不从数据库中删除它。
shops.delete(a_shop)
会导致删除SQL查询。我只想将商店从ActiveRecord数组中删除,而不是从数据库中删除。
可以这样做吗?
由于
答案 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