migrate custom values to their proper bool representation

pull/3695/head
Jens Ulferts 9 years ago
parent d56ee98ceb
commit 7621676460
  1. 85
      db/migrate/20151028063433_boolearlize_bool_custom_values.rb

@ -0,0 +1,85 @@
class BoolearlizeBoolCustomValues < ActiveRecord::Migration
def up
update_custom_values(fake_true, db_true, fake_false, db_false)
update_queries(fake_true, db_true_unquoted, fake_false, db_false_unquoted)
end
def down
update_custom_values(db_true, fake_true, db_false, fake_false)
update_queries(db_true_unquoted, fake_true, db_false_unquoted, fake_false)
end
private
def update_custom_values(old_true, new_true, old_false, new_false)
bool_custom_fields.each do |bool_custom_field|
alter(CustomValue, bool_custom_field, old_false, new_false)
alter(CustomValue, bool_custom_field, old_true, new_true)
alter(CustomizableJournal, bool_custom_field, old_false, new_false)
alter(CustomizableJournal, bool_custom_field, old_true, new_true)
end
end
def update_queries(old_true, new_true, old_false, new_false)
queries = Query.all
queries.each do |query|
query.filters.each do |filter|
update_filter(filter, old_true, new_true, old_false, new_false)
end
query.save
end
end
def update_filter(filter, old_true, new_true, old_false, new_false)
custom_field_match = filter.field.to_s.match(/\Acf_(\d+)\z/)
return unless custom_field_match
custom_field_id = custom_field_match[1].to_i
bool_custom_field = bool_custom_fields.find { |cf| cf.id == custom_field_id }
return unless bool_custom_field
filter
.values
.map! { |v| v == old_false ? new_false : v }
.map! { |v| v == old_true ? new_true : v }
end
def bool_custom_fields
@bool_custom_fields ||= CustomField.where(field_format: 'bool').all
end
def alter(scope, custom_field, old, new)
scope
.where(custom_field_id: custom_field.id,
value: old)
.update_all(value: new)
end
def db_false
ActiveRecord::Base.connection.quoted_false
end
def db_true
ActiveRecord::Base.connection.quoted_true
end
def db_false_unquoted
ActiveRecord::Base.connection.unquoted_false
end
def db_true_unquoted
ActiveRecord::Base.connection.unquoted_true
end
def fake_false
'0'
end
def fake_true
'1'
end
end
Loading…
Cancel
Save