Используйте вспомогательные методы с булевыми атрибутами при расширении из 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 
Другие вопросы по тегам