Ruby on rails activerecord迁移中序列化列的默认值

Ruby on rails activerecord迁移中序列化列的默认值,ruby-on-rails,activerecord,migration,Ruby On Rails,Activerecord,Migration,因此,我有一个序列化列:dimensions,在迁移过程中,我希望将该字段设置为默认哈希 我试过 create_table :shipping_profiles do |t| t.string :dimensions_in, :default => {:width => 0, :height => 0, :depth => 0} 而且 t.string :dimensions_in, :default => Hash.new() 但字段最终

因此,我有一个序列化列:dimensions,在迁移过程中,我希望将该字段设置为默认哈希

我试过

create_table :shipping_profiles do |t|
      t.string      :dimensions_in, :default => {:width => 0, :height => 0, :depth => 0}
而且

t.string :dimensions_in, :default => Hash.new()

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

当Rails序列化哈希以保存在db中时,它所做的只是将其转换为YAML,以便将其存储为字符串。要在迁移中实现这一点,您只需将哈希转换为yaml

t.string :dimensions_in, :default => {:width => 0, :height => 0, :depth => 0}.to_yaml
或者,在初始化后在模型中设置它

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
class ShippingProfile0,:高度=>0,:深度=>0}
结束
结束

我尝试了这个代码,它对我有效。这利用了ActiveRecord动态发送同步到表列的模型方法的方式

class MyModel < ActiveRecord::Base

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

end
classmymodel0,:高度=>0,:深度=>0}
结束
结束

您还可以为序列化列指定默认类。看

classmymodel
我发现初始化后的块会导致巨大的性能损失,特别是如果您需要
MyModel.all
(例如:批量导出)

没有类:
MyModel.new.dimensions\u in=>nil


使用默认哈希类:
MyModel.new.dimensions\u in=>{}

很高兴了解迁移中的yaml技巧,谢谢!不幸的是,在我的情况下,这是行不通的。我使用的是MySQL和文本字段类型,组合不支持默认值。请小心初始化后的解决方案,因为在实例化大量对象(如ActiveRecord finder查询)时,可能会产生巨大的性能开销。最有效的方法是按照@DragonStar的详细说明覆盖访问器-尽管请参阅我的评论以使其适用于序列化属性。太好了!可以用作默认值,而无需在迁移中指定默认值这不适用于序列化的属性,例如
serialize:dimensions\u in,Hash
,因为属性返回为对象类型,因此是“存在的”。你需要做一些类似于
attributes['dimensions\u in']的事情。呈现?属性['dimensions_in']:{width:0,height:0,depth:0}
但是如何通过此方法传递默认值?@ZuhaibAli来自文档:“该属性的默认值将是该类的一个新实例。”因此,使用此方法,它只是一个新实例,不能是自定义的。
class MyModel < ActiveRecord::Base
  serialize :dimensions_in, Hash
end