activerecord迁移中序列化列的默认值

bre*_*ter 18 migration activerecord ruby-on-rails

所以我有一个序列化的列:维度,在我的迁移中,我想将该字段设置为默认哈希.

我试过了...

create_table :shipping_profiles do |t|
      t.string      :dimensions_in, :default => {:width => 0, :height => 0, :depth => 0}
Run Code Online (Sandbox Code Playgroud)

只是

t.string :dimensions_in, :default => Hash.new()
Run Code Online (Sandbox Code Playgroud)

但是这些字段最终为空.如何在创建时为此字段设置默认的序列化对象,或者至少确保我的serialize属性始终是哈希?

idl*_*ers 34

当Rails序列化一个哈希值以保存在db中时,它所做的只是将它转换为YAML,以便它可以存储为字符串.要使其在迁移中起作用,您需要做的就是将哈希转换为yaml ...

t.string :dimensions_in, :default => {:width => 0, :height => 0, :depth => 0}.to_yaml
Run Code Online (Sandbox Code Playgroud)

或者,也可以在初始化后将其设置在模型中......

class ShippingProfile < ActiveRecord::Base

  after_initialize :set_default_dimensions

  private

    def set_default_dimensions
      self.dimensions_in ||= {:width => 0, :height => 0, :depth => 0}
    end

end
Run Code Online (Sandbox Code Playgroud)

  • 非常了解迁移中的yaml技巧,谢谢! (3认同)

whi*_*101 8

您还可以为序列化列指定默认类.查看文档.

class MyModel < ActiveRecord::Base
  serialize :dimensions_in, Hash
end
Run Code Online (Sandbox Code Playgroud)

我发现after_initialize块会导致巨大的性能损失,特别是如果你需要MyModel.all(例如:用于批量导出)

没有班级: MyModel.new.dimensions_in => nil

使用默认的Hash类: MyModel.new.dimensions_in => {}

  • 但是如何通过这种方法传递默认值? (2认同)

saq*_*o88 5

我试过这段代码,它对我有用。这利用了 ActiveRecord 发送同步到表列的模型方法的方式。

class MyModel < ActiveRecord::Base

  def dimensions_in
    attributes["dimensions_in"] ||= {:width => 0, :height => 0, :depth => 0}
  end

end
Run Code Online (Sandbox Code Playgroud)