从 Virtus.model 动态扩展时使用布尔属性辅助方法
Use boolean attribute helper methods when extending from Virtus.model on the fly
假设我有一个带有布尔属性 active
:
的 Virtus 模型 User
class User
include Virtus.model
attribute :active, Boolean, default: false, lazy: true
end
然后我可以使用辅助方法 active?
:
User.new.active? # => false
User.new(active: true).active? # => true
但是当我尝试从 Virtus.model
到 extend
并动态定义一个布尔属性时:
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
在这种情况下是否有可能使用辅助方法?
您的项目中很可能还有另一个 gem 定义了顶级 Boolean
class 并且它与布尔值冲突属性方法。例如,Mongoid known to do that. In such case, the Virtus README suggests 使用属性的 Axiom::Types::Boolean
类型。
但是,当我尝试这样做时,它没有帮助。我相信 README 实际上是错误的,Issue #234 comment 中记录了正确的类型: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
假设我有一个带有布尔属性 active
:
User
class User
include Virtus.model
attribute :active, Boolean, default: false, lazy: true
end
然后我可以使用辅助方法 active?
:
User.new.active? # => false
User.new(active: true).active? # => true
但是当我尝试从 Virtus.model
到 extend
并动态定义一个布尔属性时:
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
在这种情况下是否有可能使用辅助方法?
您的项目中很可能还有另一个 gem 定义了顶级 Boolean
class 并且它与布尔值冲突属性方法。例如,Mongoid known to do that. In such case, the Virtus README suggests 使用属性的 Axiom::Types::Boolean
类型。
但是,当我尝试这样做时,它没有帮助。我相信 README 实际上是错误的,Issue #234 comment 中记录了正确的类型: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