【发布时间】:2017-06-29 12:44:36
【问题描述】:
有一个带有序列化列的大模型
serialize :places
存储了几个地方。
City.all.first.places
=> "[school, libary, store, flowers, bank]"
我想删除所有鲜花,并将“商店”重命名为“仓库”
有“商店”,就应该有“教堂”
我创建了以下任务,但如果我检查一些条目,数据是相同的。
City.all.each do |city|
next unless city.places.present?
places = city.places[1..-2].split(', ')
places.delete('flowers')
if places.include?('store')
places.delete('store')
places.push('warehouse','church')
end
city.places = places
city.save
end
【问题讨论】:
-
试着把它分解成一个最小的问题。
city.places = ["school", "libary", "bank", "warehouse", "church"]; city.savecity.errors。 -
你序列化的列已经是一个数组,所以不需要使用
split。在控制台试试这个:City.all.first.places.class,你会得到=> Array(顺便说一句,你可以跳过all直接去first)。 -
而 city.places[1..-2].split(', ') 可能不会做你想做的事。更好的方法是去除所有空格的字符串(如果它们只能在逗号之后) city.places.gsub(/\s+/, "").split(',') 或只有空格在逗号之后 city.places.gsub(', ', ',').split(',')
-
@TomLord 消息是空的,base 是对象。 .
-
让我们弄清楚...您的问题的一个最小的、可重现的例子是:
puts city.places => <original>; city.places = <new>; city.save => true; city.places => <original>???!!!!
标签: ruby-on-rails ruby serialization