Commit 22fb63564f8bd40e00d39ab4aff68b08aebcd97a
Exists in
theme-brasil-digital-from-staging
and in
9 other branches
Merge branch 'rails3' into rails3_stable
Showing
1 changed file
with
30 additions
and
0 deletions
Show diff stats
| ... | ... | @@ -0,0 +1,30 @@ |
| 1 | +class FixYamlEncoding < ActiveRecord::Migration | |
| 2 | + def self.up | |
| 3 | + fix_encoding(Block, 'settings') | |
| 4 | + fix_encoding(Product, 'data') | |
| 5 | + fix_encoding(Environment, 'settings') | |
| 6 | + fix_encoding(Profile, 'data') | |
| 7 | + fix_encoding(ActionTracker::Record, 'params') | |
| 8 | + fix_encoding(Article, 'setting') | |
| 9 | + end | |
| 10 | + | |
| 11 | + def self.down | |
| 12 | + puts "Warning: cannot restore original encoding" | |
| 13 | + end | |
| 14 | + | |
| 15 | + private | |
| 16 | + | |
| 17 | + def self.fix_encoding(model, param) | |
| 18 | + result = model.find(:all, :conditions => "#{param} LIKE '%!binary%'") | |
| 19 | + puts "Fixing #{result.count} rows of #{model} (#{param})" | |
| 20 | + result.each {|r| r.update_column(param, deep_fix(r.send(param)).to_yaml)} | |
| 21 | + end | |
| 22 | + | |
| 23 | + def self.deep_fix(hash) | |
| 24 | + hash.each do |value| | |
| 25 | + value.force_encoding('UTF-8') if value.is_a?(String) && !value.frozen? && value.encoding == Encoding::ASCII_8BIT | |
| 26 | + deep_fix(value) if value.respond_to?(:each) | |
| 27 | + end | |
| 28 | + end | |
| 29 | + | |
| 30 | +end | ... | ... |