ActiveRecord :: Store с именами полей, взятыми из другой таблицы - PullRequest
4 голосов
/ 11 марта 2019

Предположим, у меня есть две модели: человек и поле в системе управления персоналом. Я хочу позволить пользователям системы добавлять пользовательские атрибуты в модель Person, создав для нее поле. Таким образом, моя модель Person будет содержать строку типа

class Person < ActiveRecord::Base
  store :fields, accessors: Field.all.pluck(:name), coder: JSON
end

Это, однако, не работает, потому что класс кэшируется, и поэтому новые поля не добавляются. Обычно я хотел бы использовать Proc или lambda, но это не сработает.
Есть ли простое решение этой проблемы, которое не зависит от добавления драгоценного камня? Могу ли я сделать это без использования ActiveRecord Store и с сериализованным столбцом, но где у меня сохраняется возможность выполнять проверки и отслеживать изменения атрибутов?

1 Ответ

2 голосов
/ 14 марта 2019

Попробуйте это

class Person < ActiveRecord::Base
  store :fields, coder: JSON

  after_initialize :add_accessors_for_field_names

  def add_accessors_for_field_names
    field_names.each do |field_name|
      singleton_class.class_eval do
        store_accessor :fields, field_name
      end
    end
  end

  def field_names
    Field.all.pluck(:name)
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...