标签: virtus

如何将字符串标识符存储到模型属性

我正在使用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并添加它吗?如果是这样,我不确定如何去做.

ruby salesforce virtus

9
推荐指数
1
解决办法
299
查看次数

动态扩展Virtus实例属性

假设我们有一个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)

是什么导致了这个问题,如何在不丢失数据的情况下转换对象?

PS

我发现了一个github问题,但似乎它毕竟没有修复(推荐的方法也没有稳定运行).

ruby ruby-on-rails ruby-on-rails-4 virtus

9
推荐指数
1
解决办法
540
查看次数

在从Virtus.model中动态扩展时使用布尔属性帮助器方法

假设我有一个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 boolean ruby-on-rails ruby-on-rails-4 virtus

7
推荐指数
1
解决办法
418
查看次数

Ruby 的 Virtus gem 与 attr_accessor

我正在查看一些关于 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)

ruby-on-rails virtus

5
推荐指数
1
解决办法
2705
查看次数