Rails: Сериализует значение как разделенный запятыми, а не как YAML - PullRequest
3 голосов
/ 25 августа 2010

Я ищу способ сохранить сериализованное значение, например.Идентификаторы в столбце.Ранее утверждалось, что это неоптимальный дизайн: столбец используется для идентификаторов связанных записей, но будет использоваться только при отображении записи - поэтому не выполняется никаких запросов с выбором по столбцу, и в этом столбце не будет выполнено никаких соединенийЛибо.

В Rails я могу сериализовать столбец с помощью:

class Activity
   serialize :data
end

Это кодирует столбец как YAML.Для удобства и поскольку я храню только одномерные массивы, содержащие только целые числа, я считаю более подходящим хранить его в виде значения, разделенного запятыми.*

def data=(ids)
    ids = ids.join(",") if ids.is_a?(Array)
    write_attribute(:data, ids)
end

def data
    (read_attribute(:data) || "").split(",")
end

Это работает довольно хорошо.Однако я хотел бы добавить методы, подобные массиву, к этому атрибуту:

activity = Activity.first
activity.data << 42
...

Как бы я это сделал?

Ответы [ 2 ]

3 голосов
/ 25 августа 2010

Вы можете сделать это с помощью функции mixed_of , как объяснено в этом посте .Это должно быть что-то вроде:

  composed_of :data, :class_name => 'Array', :mapping => %w(data to_csv),
                   :constructor => Proc.new {|column| column.to_csv},
                   :converter   => Proc.new {|column| column.to_csv}

  after_validation do |u|
    u.data = u.data if u.data.dirty? # Force to serialize
  end

Не проверял, хотя.

1 голос
/ 12 мая 2011

Вы можете использовать serialize с пользовательским кодером в рельсах 3.1.

Смотрите мой ответ на этот вопрос .: -)

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