我有一个名为Restream::Custom
的模型和一个属性url
。然后我想将url
属性分成两部分:server_url
和key
,并将两者都分开。
我为此写了这样的迁移:
def up
add_column :restream_customs, :key, :string
Restream::Custom.find_each do |r|
last_slash = r.url.rindex("/")
r.key = r.url[last_slash + 1 .. -1] #everything after last slash
r.url = r.url[0 .. last_slash - 1] #everything before last slash
r.save!
end
change_column :restream_customs, :key, :string, null: false
rename_column :restream_customs, :url, :server_url
end
这在开发上运作良好。之后,我在restream/custom.rb
中进行了大量更改,以便与server_url
一起使用并验证它。
此次迁移因此在暂存时失败(并且在生产时失败),因为在运行r.save!
时,它面临validates :server_url, presence: true
并抛出unknown attribute 'server_url' for Restream::Custom
。
如何才能正确进行此更改?在一个回合中,如果可能的话。 (不要多次从回购中提取)。
答案 0 :(得分:0)
在更新数据之前尝试将列url
重命名为server_url
def up
add_column :restream_customs, :key, :string
rename_column :restream_customs, :url, :server_url
Restream::Custom.find_each do |r|
last_slash = r.server_url.rindex("/")
r.key = r.server_url[last_slash + 1 .. -1] #everything after last slash
r.server_url = r.server_url[0 .. last_slash - 1] #everything before last slash
r.save!
end
change_column :restream_customs, :key, :string, null: false
end