3

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

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

2 回答 2

2

to_s因为 ActiveRecord::Base 具有标准序列化方法(包括and )的自定义实现,所以as_json除非您以某种方式进行干预,否则您将永远不会看到没有支持数据库列的模型属性。

您可以使用以下内容将其呈现为 JSON:

render json: my_object, methods: [:virtual_attr1, :virtual_attr2]

或者你可以as_json直接使用序列化器:

my_object.as_json(methods: [:virtual_attr1, :virtual_attr2])
于 2013-05-02T13:37:25.770 回答
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调用。

于 2013-05-01T22:07:19.873 回答