3

DB に保存されるいくつかのフィールドを持つ標準モデルがあり、保存する必要のないフィールドが 1 つ必要です。

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

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])
于 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"

おそらく呼び出しを使用して、 attr_accessor メソッドではなく、データベースで定義されている属性のみを考慮するActiveRecord::Baseメソッドを定義しているため、この出力が表示されます。to_sattributes

于 2013-05-01T22:07:19.873 に答える