我正在使用Virtus创建代表Salesforce对象的模型.
我正在尝试创建具有友好名称的属性,这些属性用于访问我可以用来检索该变量的标识符"String"的值和方法.
Object.attribute #=> "BOB"
Object.get_identifier(:attribute_name) #=> "KEY"
# OR something like this
Object.attribute.identifier #=> "KEY"
Run Code Online (Sandbox Code Playgroud)
友好名称用作getter/setter以及我可以存储与API名称对应的每个属性的标识符.
这是一个例子:
class Case
include Virtus.model
attribute :case_number, String, identifier: 'Case_Number__c'
end
c = Case.new(case_number: 'XXX')
c.case_number #=> 'XXX'
c.case_number.identifier #=> 'Case_Number__c'
Run Code Online (Sandbox Code Playgroud)
或者,不是在Attribute本身上有方法,也许为每个标识符集创建一个辅助方法:
c.case_number #=> 'XXX'
c.case_number_identifier #=> 'Case_Number__c'
Run Code Online (Sandbox Code Playgroud)
我可以扩展Virtus :: Attribute并添加它吗?如果是这样,我不确定如何去做.
假设我们有一个Virtus模型 User
class User
include Virtus.model
attribute :name, String, default: 'John', lazy: true
end
Run Code Online (Sandbox Code Playgroud)
然后我们创建一个这个模型的实例并从中扩展Virtus.model以动态添加另一个属性:
user = User.new
user.extend(Virtus.model)
user.attribute(:active, Virtus::Attribute::Boolean, default: true, lazy: true)
Run Code Online (Sandbox Code Playgroud)
当前输出:
user.active? # => true
user.name # => 'John'
Run Code Online (Sandbox Code Playgroud)
但是当我尝试attributes通过as_json(或to_json)将对象转换为JSON 或Hash通过to_h我只获得扩展后属性时active:
user.to_h # => { active: true }
Run Code Online (Sandbox Code Playgroud)
是什么导致了这个问题,如何在不丢失数据的情况下转换对象?
我发现了一个github问题,但似乎它毕竟没有修复(推荐的方法也没有稳定运行).
假设我有一个User带有布尔属性的Virtus模型active:
class User
include Virtus.model
attribute :active, Boolean, default: false, lazy: true
end
Run Code Online (Sandbox Code Playgroud)
然后我可以使用辅助方法active?:
User.new.active? # => false
User.new(active: true).active? # => true
Run Code Online (Sandbox Code Playgroud)
但是当我尝试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
Run Code Online (Sandbox Code Playgroud)
并使用帮助器方法active?我得到一个NoMethodError例外.
user.active? # => NoMethodError: undefined method `active?' for
Run Code Online (Sandbox Code Playgroud)
在这种情况下是否有可能使用辅助方法?
我正在查看一些关于 Ruby 中服务对象的教程中使用的 Virtus gem。在 github 页面https://github.com/solnic/virtus中,它给出了以下示例。
将 Virtus 与类结合使用
您可以创建使用 Virtus 扩展的类并定义属性:
class User include Virtus.model
attribute :name, String
attribute :age, Integer
attribute :birthday, DateTime
end
user = User.new(:name => 'Piotr', :age => 31) user.attributes # => { :name => "Piotr", :age => 31, :birthday => nil }
user.name # => "Piotr"
user.age = '31' # => 31 user.age.class # => Fixnum
user.birthday = 'November 18th, 1983' # => #<DateTime: 1983-11-18T00:00:00+00:00 (4891313/2,0/1,2299161)>
# mass-assignment user.attributes = { …Run Code Online (Sandbox Code Playgroud)