Используйте вспомогательные методы с булевыми атрибутами при расширении из Virtus.model на лету
Допустим, у меня есть модель Virtus User
с логическим атрибутом active
:
class User
include Virtus.model
attribute :active, Boolean, default: false, lazy: true
end
Тогда я мог бы использовать вспомогательный метод active?
:
User.new.active? # => false
User.new(active: true).active? # => true
Но когда я пытаюсь extend
от Virtus.model
и определить логический атрибут на лету:
class User; end
user = User.new
user.extend(Virtus.model)
user.attribute(:active, Axiom::Types::Boolean, default: false, lazy: true)
user.active = true
и использовать вспомогательный метод active?
Я получаю NoMethodError
своего рода исключение.
user.active? # => NoMethodError: undefined method `active?' for
Есть ли возможность использовать вспомогательные методы в этой ситуации?
1 ответ
Скорее всего, в вашем проекте есть еще один драгоценный камень, который определяет верхний уровень Boolean
класс, и это конфликтует с методами логического атрибута. Например, Mongoid, как известно, делает это. В таком случае Virtus README предлагает использовать Axiom::Types::Boolean
тип атрибута вместо.
Однако когда я попробовал это, это не помогло. Я считаю, что README на самом деле не так, правильный тип отмечен в комментарии к выпуску № 234: Virtus::Attribute::Boolean
,
Полный рабочий пример:
class User; end
user = User.new
user.extend(Virtus.model)
user.attribute(:active,
Virtus::Attribute::Boolean, # <- note the type
default: false, lazy: true)
user.active = true
user.active?
#=> true