Spec-Zone.ru › Ruby on Rails 5.2

модуль 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

Атрибуты

local_stored_attributes[RW]

Закрытые методы экземпляра

read_store_attribute(store_attribute, key) Показать исходный код
# File activerecord/lib/active_record/store.rb, line 127
def read_store_attribute(store_attribute, key) # :doc:
  accessor = store_accessor_for(store_attribute)
  accessor.read(self, store_attribute, key)
end
write_store_attribute(store_attribute, key, value) Показать исходный код
# File activerecord/lib/active_record/store.rb, line 132
def write_store_attribute(store_attribute, key, value) # :doc:
  accessor = store_accessor_for(store_attribute)
  accessor.write(self, store_attribute, key, value)
end

© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API