aboutsummaryrefslogtreecommitdiffstats
path: root/spec/dummy/db/migrate/20110802081571_create_seo_meta.rb
blob: abc217873641fa3d8a1f730a015727950502fd60 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
class CreateSeoMeta < ActiveRecord::Migration

  def self.up
    create_table :seo_meta do |t|
      t.integer :seo_meta_id
      t.string :seo_meta_type

      t.string :browser_title
      t.string :meta_keywords
      t.text :meta_description

      t.timestamps
    end

    add_index :seo_meta, :id
    add_index :seo_meta, [:seo_meta_id, :seo_meta_type]

    # Grab the attributes of the records that currently exist
    existing_translations = ::Refinery::Page.translation_class.all.map(&:attributes)

    # Remove columns
    ::SeoMeta.attributes.keys.each do |field|
      if ::Refinery::Page.translation_class.column_names.map(&:to_sym).include?(field)
        remove_column ::Refinery::Page.translation_class.table_name, field
      end
    end

    # Reset column information because otherwise the old columns will still exist.
    ::Refinery::Page.translation_class.reset_column_information

    # Re-attach seo_meta
    ::Refinery::Page.translation_class.send :is_seo_meta

    # Migrate data
    existing_translations.each do |translation|
      ::Refinery::Page.translation_class.find(translation['id']).update_attributes(
        ::SeoMeta.attributes.keys.inject({}) {|attributes, name|
          attributes.merge(name => translation[name.to_s])
        }
      )
    end

    # Reset column information again because otherwise the old columns will still exist.
    ::Refinery::Page.reset_column_information
  end

  def self.down
    # Grab the attributes of the records that currently exist
    existing_translations = ::Refinery::Page.translation_class.all.map(&:attributes)

    # Add columns back to your model
    ::SeoMeta.attributes.each do |field, field_type|
      unless ::Refinery::Page.translation_class.column_names.map(&:to_sym).include?(field)
        add_column ::Refinery::Page.translation_class.table_name, field, field_type
      end
    end

    # Reset column information because otherwise the new columns won't exist yet.
    ::Refinery::Page.translation_class.reset_column_information

    # Migrate data
    existing_translations.each do |translation|
      ::Refinery::Page.translation_class.update_all(
        ::SeoMeta.attributes.keys.inject({}) {|attributes, name|
          attributes.merge(name => translation[name.to_s])
        }, :id => translation['id']
      )
    end

    ::SeoMeta.attributes.keys.each do |k|
      ::Refinery::Page.translation_class.module_eval %{
        def #{k}
        end

        def #{k}=(*args)
        end
      }
    end

    # Reset column information again because otherwise the old columns will still exist.
    ::Refinery::Page.reset_column_information

    drop_table :seo_meta
  end

end