Я предлагаю вам взглянуть на что-то вроде attr_bucket .Якобы, это может быть использовано для решения некоторых проблем наследования, но это также решит вашу проблему для вас.Вот суть.
Похоже, вы знаете, каковы все ваши разрешения, но вы хотите сериализовать их все в одном поле базы данных.Но в вашем реальном приложении rails вы хотите обрабатывать все ваши разрешения, как если бы они были полностью отдельными полями.Это именно то, что позволит вам сделать решение типа attr_bucket
.Давайте возьмем ваш пример, вы бы сделали что-то вроде этого:
class User::Affiliation::Role < ActiveRecord::Base
attr_bucket :permissions => [:permissions_customer_club_events_read, :permissions_customer_club_events_write, :permission_do_crazy_things]
after_initialize :init
def init
## Sets base permission structure ##
self.permissions ||= YAML.load_file("#{Rails.root}/config/permissions.yml")
end
end
Теперь вы сможете использовать permissions_customer_club_events_read
, permissions_customer_club_events_write
, permission_do_crazy_things
, как если бы они были отдельными полями базы данных (это включает использованиеих в формах и т. д.), но когда вы на самом деле сохраняете свои объекты, все эти поля объединяются и сериализуются в поле :permissions
.
Единственное предостережение - механизм сериализации, я полагаю attr_bucket
будет сериализовать все, используя YAML, тогда как вы использовали JSON.Если это не имеет значения, то вы золотой, в противном случае вам может потребоваться установить патч attr_bucket
, чтобы использовать json вместо YAML, что должно быть довольно простым.