模型的模型部分中的虚拟字段,但不在DB中

时间:2013-05-01 21:10:43

标签: ruby-on-rails ruby

我有一个标准模型,其中包含一些保存到数据库的字段,我需要一个不需要保存的字段。

我试过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>

2 个答案:

答案 0 :(得分:2)

因为ActiveRecord :: Base具有标准序列化方法的自定义实现(包括to_sas_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调用