модуль ActiveRecord::Store
Store предоставляет тонкий обертка вокруг serialize для хранения хэшей в одном столбце. Это как простой хранилище ключей/значений, встроенный в вашу запись, когда вам неважно возможность запросить это хранилище вне контекста одной записи.
Вы можете объявить аксессоры для этого хранилища, которые затем доступны так же, как и любой другой атрибут модели. Это очень полезно для лёгкого отображения ключей хранилища в форме или где-либо ещё, где уже используется доступ к атрибутам модели.
Убедитесь, что вы объявляете столбец базы данных, используемый для сериализованного хранилища, как текстовый, чтобы было достаточно места.
Вы можете установить пользовательский кодировщик для кодирования/декодирования ваших сериализованных атрибутов в/из разных форматов. JSON, YAML, Marshal поддерживаются по умолчанию. В целом, это может быть любой обертка, которая предоставляет load и dump.
ПРИМЕЧАНИЕ: Если вы используете специфичные для PostgreSQL столбцы, такие как hstore или json, нет необходимости в сериализации, предоставляемой .store. Просто используйте .store_accessor вместо этого для генерации методов аксессоров. Имейте в виду, что эти столбцы используют хэш с ключами в виде строк и не позволяют доступа с использованием символов.
ПРИМЕЧАНИЕ: По умолчанию валидации, за исключением uniqueness, будут работать. Например, если вы хотите проверить uniqueness с hstore, вам нужно будет использовать пользовательскую валидацию для её обработки.
Примеры:
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 125 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 130 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.