【问题标题】:Set new column value from serialized hash in migration在迁移中从序列化哈希设置新列值
【发布时间】:2015-02-09 11:24:29
【问题描述】:

我有一个模型,它有一些信息最好存储为模型上的序列化哈希,因为它对大多数应用程序并不重要,并且因实例而异:

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

【问题讨论】:

  • 哇,我在匿名这个问题的代码方面做得很糟糕。好在它实际上并没有包含任何有趣的东西。

标签: ruby-on-rails rails-migrations


【解决方案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 的好东西,同时保持时间独立,因为您在 app 文件夹中的真实模型永远不会加载。

【讨论】:

    猜你喜欢
    • 2016-06-07
    • 2013-06-25
    • 2022-01-05
    • 2017-06-26
    • 2013-04-17
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多