Как получить список всех атрибутов Virtus одного типа?

Как получить список всего одного типа?
Как, например, список всех атрибутов String? Есть ли простое решение Virtus или мне нужно накатить свое?

def my_model
  include Virtus.model
  attribute :a, Integer
  attribute :b, Integer
  attribute :c, String
  attribute :d, String
  attribute :w, Float
  attribute :j, Float
end

Я хотел бы по существу сделать my_model.something = [:c, :d]

ИЛИ есть ли другой способ получить все атрибуты String в форме списка?

Моя конечная цель состоит в том, чтобы иметь возможность разделять атрибуты на различные проверки в зависимости от типа.

1 ответ

Решение

Вы можете использовать attribute_set метод наряду с primitive чтобы получить атрибут Class, а затем вам нужно написать свой собственный метод:

def self.get_string_attributes
  attributes = []
  self.attribute_set.each do |attribute|
    attributes << attribute.name if attribute.primitive == String
  end
  attributes
end

Я получаю это результаты с вашим MyModel:

MyModel.get_string_attributes
=> [:c, :d]

O̶r̶ ̶y̶o̶u̶ ̶c̶a̶n̶ ̶g̶o̶ ̶a̶ ̶s̶t̶e̶p̶ ̶f̶u̶r̶t̶h̶e̶r̶ ̶a̶n̶d̶ ̶u̶s̶e̶ ̶d̶e̶f̶i̶n̶e̶ ̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶

Я надеюсь, что это то, что вы ищете.

Другие вопросы по тегам