Использование Rails serialize для сохранения хэша в базе данных
Я пытаюсь сохранить хэш-сопоставление идентификаторов для нескольких попыток в моем приложении 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 ответов:
неверный тип столбца. Вы должны использовать текст вместо строки. Поэтому ваша миграция должна быть:
def self.up add_column :users, :multi_wrong, :text endтогда Rails правильно преобразует его в YAML для вас (и выполняет правильную сериализацию). Поля строк ограничены по размеру и будут содержать только особо-малые значения.
обновление:
точная реализация будет зависеть от вашей базы данных, но PostgreSQL теперь имеет
jsonиjsonbстолбцы, которые могут изначально хранить ваши данные хэша / объекта и позволяют вам запрос к JSON с ActiveRecord!измените миграцию, и все готово.
class Migration0001 def change add_column :users, :location_data, :json, default: {} end endоригинал:
для более подробной информации:rails docs && 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Более Удивительным?!
использовать postgresql hstore
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
Rails 4 имеет новую функцию под названием магазине, Так что вы можете легко использовать его, чтобы решить вашу проблему. Вы можете определить для него метод доступа, и рекомендуется объявить столбец базы данных, используемый для сериализованного хранилища, как текст, поэтому есть много места. Исходный пример:
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'
Comments