Использование Rails для сериализации, чтобы сохранить хэш в базе данных - PullRequest
133 голосов
/ 14 июля 2011

Я пытаюсь сохранить хэш-идентификаторы для нескольких попыток в моем приложении 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

Вывод ложный.Что здесь не так?

Ответы [ 3 ]

172 голосов
/ 15 июля 2011

Неправильный тип столбца.Вы должны использовать текст вместо строки.Следовательно, ваша миграция должна быть:

 def self.up
   add_column :users, :multi_wrong, :text
 end

Тогда Rails правильно преобразует ее в YAML для вас (и выполнит правильную сериализацию).Строковые поля имеют ограниченный размер и будут содержать только особо малые значения.

66 голосов
/ 28 января 2014

ОБНОВЛЕНО:

Точная реализация будет зависеть от вашей базы данных, но в PostgreSQL теперь есть столбцы json и jsonb, которые могут изначально хранить ваши данные хеш / объекта и позволяют вам запрос к JSON с ActiveRecord !

измените миграцию, и все готово.

class Migration0001
  def change
    add_column :users, :location_data, :json, default: {}
  end
end

ОРИГИНАЛ:

Для более подробной информации: рельсы документы && apidock

Убедитесь, что ваш столбец :text, а не :string

Миграция:

$ rails g migration add_location_data_to_users location_data:text

должна создать:

class Migration0001
  def change
    add_column :users, :location_data, :text
  end
end

Ваш класс будет выглядетьКак:

class User < ActiveRecord::Base
  serialize :location_data
end

Доступные действия:

b = User.new
b.location_data = [1,2,{foot: 3, bart: "noodles"}]
b.save

More Awesome?!

использовать postgresqlhstore

class AddHstore < ActiveRecord::Migration  
  def up
    enable_extension :hstore
  end

  def down
    disable_extension :hstore
  end
end 

class Migration0001
  def change
    add_column :users, :location_data, :hstore
  end
end

С помощью hstore вы можете установить атрибуты в сериализованном поле

class User < ActiveRecord::Base  
  # setup hstore
  store_accessor :location_data, :city, :state
end
17 голосов
/ 18 апреля 2016

Rails 4 имеет новую функцию под названием Store , так что вы можете легко использовать ее для решения вашей проблемы. Вы можете определить метод доступа к нему, и рекомендуется объявить столбец базы данных, используемый для сериализованного хранилища, в виде текста, так что места достаточно. Исходный пример:

class User < ActiveRecord::Base
  store :settings, accessors: [ :color, :homepage ], coder: JSON
end

u = User.new(color: 'black', homepage: '37signals.com')
u.color                          # Accessor stored attribute
u.settings[:country] = 'Denmark' # Any attribute, even if not specified with an accessor

# There is no difference between strings and symbols for accessing custom attributes
u.settings[:country]  # => 'Denmark'
u.settings['country'] # => 'Denmark'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...