по умолчанию для сериализованного столбца в переносе activerecord - PullRequest
18 голосов
/ 09 февраля 2011

поэтому у меня есть сериализованный столбец: размеры, и в моей миграции я хотел бы установить поле в качестве хэша по умолчанию.

я пытался ...

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

и просто

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

, но поля заканчиваются нулем.Как я могу установить сериализованный объект по умолчанию для этого поля при создании или, по крайней мере, убедиться, что мой атрибут сериализации всегда является хешем?

Ответы [ 3 ]

34 голосов
/ 09 февраля 2011

Когда Rails сериализует хеш для сохранения в БД, все, что он делает, это конвертирует его в 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
8 голосов
/ 29 января 2013

Вы также можете указать класс по умолчанию для сериализованного столбца.См. документы .

class MyModel < ActiveRecord::Base
  serialize :dimensions_in, Hash
end

Я обнаружил, что блоки after_initialize могут вызвать огромный удар производительности , особенно если вынеобходимо MyModel.all (например: для массового экспорта)

без класса: MyModel.new.dimensions_in => nil

со стандартным классом хэширования: MyModel.new.dimensions_in => {}

4 голосов
/ 14 июня 2011

Я попробовал этот код, и он работал для меня.Это позволяет использовать метод ActiveRecord, который динамически отправляет методы модели в столбцы таблицы.

class MyModel < ActiveRecord::Base

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

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...