Я пытаюсь сохранить хэш-идентификаторы для нескольких попыток в моем приложении rails. Моя миграция в базу данных для размещения этого нового столбца:
class AddMultiWrongToUser < ActiveRecord::Migration
def self.up
add_column :users, :multi_wrong, :string
end
def self.down
remove_column :users, :multi_wrong
end
end
В моей модели у меня есть:
class User < ActiveRecord::Base
serialize :multi_wrong, Hash
end
Но когда я использую консоль rails, чтобы проверить это, выполните:
user = User.create()
user.multi_wrong = {"test"=>"123"}
user.save
Выход ложный. Что здесь не так?
ruby-on-rails
ruby
serialization
activerecord
cmwright
источник
источник
Ответы:
Тип столбца неправильный. Вы должны использовать текст вместо строки. Следовательно, ваша миграция должна быть:
Тогда Rails будет правильно конвертировать его в YAML для вас (и выполнить правильную сериализацию). Строковые поля ограничены по размеру и будут содержать только особо малые значения.
источник
ОБНОВЛЕНО:
Точная реализация будет зависеть от вашей базы данных, но в PostgreSQL теперь есть
json
иjsonb
столбцы, которые могут хранить ваши хеш / объектные данные и позволять вам выполнять запросы к JSON с ActiveRecord !измените свою миграцию, и все готово.
ОРИГИНАЛ:
Больше подробностей: rails docs && apidock
Убедитесь, что ваш столбец есть,
:text
а не:string
Миграция:
$ rails g migration add_location_data_to_users location_data:text
должен создать:
Ваш класс будет выглядеть так:
Доступные действия:
Более круто ?!
использовать postgresql hstore
С hstore вы можете установить атрибуты в сериализованном поле
источник
В Rails 4 появилась новая функция, которая называется Store , поэтому вы можете легко использовать ее для решения вашей проблемы. Вы можете определить для него метод доступа, и рекомендуется объявить столбец базы данных, используемый для сериализованного хранилища, в виде текста, так что места достаточно. Оригинальный пример:
источник