2015-02-09 57 views
0

我有一個模型,它具有一些最好作爲序列化哈希存儲在模型上的信息,因爲它對大多數應用程序並不重要,因實例而異:從遷移中的序列化哈希設置新的列值

class Foo < AR::Base 
    attr_accessible :name, :fields 
    serialize :fields 
end 

我已經意識到fields中的一個常見條目其實與應用程序有關,並且最好作爲屬性放置(layout)。請記住,我不應該在遷移時參考模型,我如何編寫遷移以添加layout字段,並使用當前位於fields哈希中的值進行初始化?

class AddLayoutToCardTemplates < ActiveRecord::Migration 
    def change 
    add_column :card_templates, :layout, :string, default: 'normal' 

    # Initialise `layout` from `fields['layout']`... how? With raw SQL? 
    end 
end 
+0

哇,我做了一個糟糕的工作匿名這個問題的代碼。好東西它並不包含任何有趣的東西。 – Chowlett 2015-02-09 11:33:52

回答

1

您不應該在應用程序文件夾中引用模型。這並不意味着你不能創建本地模型。 :)

class AddLayoutToCardTemplates < ActiveRecord::Migration 
    class Foo < AR::Base 
    attr_accessible :name, :fields 
    serialize :fields 
    end 

    def change 
    add_column :card_templates, :layout, :string, default: 'normal' 
    Foo.all.each do |f| 
     f.layout = f.fields.delete(:layout) 
     f.save 
    end 
end 

這樣,你的遷移可以使用ActiveRecord的東西,但停留時間無關,如應用程序文件夾中的真實模型永遠不會加載。