модуль ActiveRecord::Store
Хранилище предоставляет тонкий обертка вокруг serialize для хранения хэшей в одном столбце. Это как простое хранилище ключ/значение, встроенное в вашу запись, когда вам неважно, можно ли запросить это хранилище за пределами контекста одной записи.
Вы можете объявить аксессоры для этого хранилища, которые будут доступны как любые другие атрибуты модели. Это очень полезно для лёгкого отображения ключей хранилища в форме или в другом месте, которое уже настроено на доступ к атрибутам модели.
Убедитесь, что столбец базы данных, используемый для сериализованного хранилища, объявлен как текст, чтобы было достаточно места.
Вы можете установить пользовательский кодер для кодирования/декодирования ваших сериализованных атрибутов в/из различных форматов. JSON, YAML, Marshal поддерживаются по умолчанию. В общем случае это может быть любой обертка, который предоставляет load и dump.
ПРИМЕЧАНИЕ - Если вы используете специфические столбцы PostgreSQL, такие как hstore или json, сериализация, предоставляемая store, не требуется. Просто используйте store_accessor для генерации методов аксессоров. Имейте в виду, что эти столбцы используют хэш с ключами-строками и не позволяют доступа с помощью символов.
Примеры:
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' # Add additional accessors to an existing store through store_accessor class SuperUser < User store_accessor :settings, :privileges, :servants end
Имена хранимых атрибутов можно получить, используя stored_attributes.
User.stored_attributes[:settings] # [:color, :homepage]
Переопределение стандартных аксессоров
Все сохранённые значения автоматически доступны через аксессоры объекта Active Record, но иногда вам нужно специализировать это поведение. Это можно сделать, переопределив стандартные аксессоры (используя то же имя, что и у атрибута) и вызвав super для фактического изменения вещей.
class Song < ActiveRecord::Base
# Uses a stored integer to hold the volume adjustment of the song
store :settings, accessors: [:volume_adjustment]
def volume_adjustment=(decibels)
super(decibels.to_i)
end
def volume_adjustment
super.to_i
end
end
Атрибуты
Защищённые методы экземпляра
# File activerecord/lib/active_record/store.rb, line 120 def read_store_attribute(store_attribute, key) accessor = store_accessor_for(store_attribute) accessor.read(self, store_attribute, key) end
# File activerecord/lib/active_record/store.rb, line 125 def write_store_attribute(store_attribute, key, value) accessor = store_accessor_for(store_attribute) accessor.write(self, store_attribute, key, value) end
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.