我有一个标准模型,其中包含一些保存到数据库的字段,我需要一个不需要保存的字段。
我试过attr_accessor,但这并没有涵盖它。使用Attr_accessor我可以设置并获取字段,但它不是模型的一部分。如果我将模型添加到数组,然后看到虚拟字段中的内容不是它的一部分。我还尝试将字段:headerfield添加到attr_accessible,但这并未改变任何内容。
如何获取属于模型但未保存到数据库的字段?
模型
class Mapping < ActiveRecord::Base
attr_accessible :internalfield, :sourcefield
attr_accessor :headerfield
end
控制台输出:
1.9.3-p194 :001 > m = Mapping.new
=> #<Mapping id: nil, internalfield: nil, sourcefield: nil, created_at: nil, updated_at: nil, data_set_id: nil>
1.9.3-p194 :002 > m.headerfield = "asef"
=> "asef"
1.9.3-p194 :003 > m
=> #<Mapping id: nil, internalfield: nil, sourcefield: nil, created_at: nil, updated_at: nil, data_set_id: nil>
答案 0 :(得分:2)
因为ActiveRecord :: Base具有标准序列化方法的自定义实现(包括to_s
和as_json
),所以除非你介入一些,否则你永远不会看到没有后备数据库列的模型属性方式。
您可以使用以下内容将其呈现为JSON:
render json: my_object, methods: [:virtual_attr1, :virtual_attr2]
或者您可以直接使用as_json
序列化程序:
my_object.as_json(methods: [:virtual_attr1, :virtual_attr2])
答案 1 :(得分:0)
您在控制台中看到的返回只是to_s的值。对于这种情况,代码应该比自然语言更好,看看下面的代码,看看你是否理解
class A
end
=> nil
A.new
=> #<A:0xb73d1528>
A.new.to_s
=> "#<A:0xb73d1528>"
class A
def to_s
"foobar"
end
end
=> nil
A.new
=> ble
A.new.to_s
=> "ble"
您可以看到此输出,因为ActiveRecord::Base
定义了一个方法to_s
,它只考虑数据库中定义的属性,而不考虑attr_accessor方法,可能使用attributes
调用