2016-03-18 2 views
0

Как получить список всех одного типа?
Как, например, список всех атрибутов String? Есть ли простое решение Virtus или мне нужно катиться самостоятельно?Как получить список всех атрибутов 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]

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

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

ответ

0

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

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] 

или вы можете пойти дальше и использовать DEFINE method_missing примерно так: ̶

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

+0

Это идеальный ответ. Очень хочу, чтобы я мог дать вам бесконечные голоса. Могу ли я спросить, насколько хороша практика использования метода? Мне просто интересно, потому что мои другие разработчики довольно хардкорны о коде, который входит в приложение. Это довольно распространено, чтобы использовать его? –

+0

Я использую его больше как DRY-решение. Я предложил его, так как вы хотите запросить разные классы, но, честно говоря, в вашем конкретном случае было бы очень сложно использовать его, поскольку вам нужно убедиться, что имя метода имеет имя класса ruby. И, как всегда, обзоры кода - это лучшее, что нужно делать при работе с другими разработчиками, пока вы делаете это вместе. – miligraf

Смежные вопросы