Я создаю приложение, в котором пользователи являются частью Organisation
.В организации много List
с, что, в свою очередь, имеет много ListItem
с.
Теперь я хотел бы, чтобы пользователи с правами администратора могли указывать, какие атрибуты доступны в элементах списка на основе организацииони принадлежат (или, скорее, в организации, к которой принадлежит их список), не касаясь какого-либо кода.
До сих пор при определении атрибутов, которые не привязаны к конкретному столбцу в базе данных, я использовал document_serializable , изящный маленький драгоценный камень (основанный на virtus ), который сериализует виртуальные атрибуты для столбца JSONB в БД.Мне нравится этот подход, потому что я получаю все положительные качества в Virtus (типы, принуждение, проверки и т. Д.), А также потому, что данные оказываются в столбце JSONB, то есть их можно быстро загружать, индексировать и просматривать с относительной простотой..
Я хотел бы продолжать использовать этот подход при добавлении этих пользовательских атрибутов на лету.Поэтому я хотел бы сделать что-то вроде:
class ListItem < ApplicationRecord
belongs_to :list
delegate :organisation, to: :list
organisation.list_attributes.each do |a, t|
attribute a, t
end
end
Где Organisation#list_attributes
возвращает пользовательский хэш имен атрибутов и связанных с ними типов, который, например, может выглядеть следующим образом:
{
name: String,
age: Integer
}
Как вы уже догадались, это не работает, потому что organisation.list_attributes.each
фактически выполняется в контексте ListItem
, который является экземпляром Class
, а Class
не имеет #organisation
метод.Я надеюсь, что это сформулировано таким образом, что имеет смысл 1 .
Я пытался использовать after_initialize
, но в этот момент в жизненном цикле объекта #attribute
принадлежит ActiveRecord::AttributeMethods::Read
а не DocumentSerializable::ClassMethods
, так что это совершенно другой метод, и я не могу понять, могу ли я получить доступ к тому, что мне нужно, и можно ли даже работать.
Другой альтернативой может быть поискОрганизация, о которой идет речь, каким-то явным образом, Organisation#find
, но я, честно говоря, не знаю, где хранить информацию, необходимую для этого.
Итак, мой вопрос: в момент создания (инициализации)или загружая 2 ) запись, есть ли способ получить хэш, хранящийся в столбце базы данных одного из его отношений?Или я пытаюсь построить это совершенно ошибочным образом, и если да, то как еще мне это сделать?
1 Чтобы уточнить, должен ли я использоватьхеш прямо так:
class ListItem < ApplicationRecord
belongs_to :list
delegate :organisation, to: :list
{
name: String,
age: Integer
}.each do |a, t|
attribute a, t
end
end
это будет работать, моя проблема исключительно в получении отношения записи в этот более ранний момент времени.
2 Насколько я понимаючто Rails запускает код модели всякий раз, когда запись этого типа создается или загружается из базы данных, то есть виртуальные атрибуты определяются заново каждый раз, когда это происходит, поэтому я спрашиваю, как это сделать в обоих случаях.