Ruby on rails 如何更新序列化列

Ruby on rails 如何更新序列化列,ruby-on-rails,ruby,serialization,Ruby On Rails,Ruby,Serialization,有一个带有序列化列的大模型 serialize :places 这里有好几个地方 City.all.first.places => "[school, libary, store, flowers, bank]" 我想删除所有鲜花,并将“商店”重命名为“仓库” 如果有“商店”,也应该有“教堂” 我创建了以下任务,但是如果我检查一些条目,数据是相同的 City.all.each do |city| next unless city.places.present? places =

有一个带有序列化列的大模型

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

听起来您应该将位置设置为它自己的表,然后设置一个连接表将它们连接到城市,如:

class City < ApplicationRecord
  has_many :city_places
  has_many :places, through: :city_places
end

class CityPlace < ApplicationRecord
  belongs_to :city
  belongs_to :place
end

class Places < ApplicationRecord
  has_many :city_places
  has_many :cities, through: :city_places
end
class城市

这样,城市可以有很多地方,如果你想重命名一个地方,你可以在数据库中更改它的名称。以下是。

尝试将其分解为一个最小的问题<代码>city.places=[“学校”、“图书馆”、“银行”、“仓库”、“教堂”];city.save
您序列化的列已经是一个数组,因此不需要使用
拆分
。在控制台中尝试此操作:
City.all.first.places.class
,您将获得
=>Array
(顺便说一句,您可以跳过
all
,直接转到
first
)。和City.places[1..-2]。拆分(“,”)可能并不是您想要的。更好的方法是去掉字符串中的所有空格(如果它们只能在逗号后出现)city.places.gsub(/\s+/,“”).split(‘,’)或仅在类似逗号的city.places.gsub(‘,’,’,’).split(‘,’)@TomLord消息为空,base中为对象。让我们弄清楚。。。您的问题的一个最小且可重复的示例是:
put city.places=>;city.places=;city.save=>true;city.places=>
???!!!!