9


3

to_jsonが仮想属性をレンダリングしないという問題に直面しています

クラスLocation <ActiveRecord :: Base belongs_to:event before_create:generate_oid validates_associated:event

attr_accessor:event_oid

def event_oid @event_oid = event.oidエンド終了

event_oidは、以下によって返される配列の一部ではありません。

Location.first.attributes

これは、レコード属性を自動的にjasonにシリアライズするto_jsonを使用するときに特に問題になります。 to_jsonは私の仮想属性を省略します。

仮想属性を実際のインスタンス属性として扱う方法を教えてください。

編集する

to_jsonは私の仮想属性を実際の属性として扱ったほうがいい方法のほんの一例です。

5 Answer


5


あなたは属性ハッシュを修正したいのです。 ここに、もう少し特別なコードを追加して、気になる属性をto_jsonまたはオブジェクトロードの属性に依存する別のメソッドで使用できるようにすることを保証します。

クラスLocation <ActiveRecord :: Base belongs_to:event before_create:generate_oid validates_associated:event

after_save:event_oid

attr_accessor:event_oid

def event_oid @event_oid = @attributes ["event_oid"] = event.oid if event.nil? 終わり

def after_initialize event_oid end

終わり

to_jsonや、オブジェクトの属性に基づいてモノのリストを生成する他の多くのメソッド。 データベースのテーブルと名前によるオブジェクトの初期化時に生成されますが、残念ながらインスタンス変数はこのハッシュを更新しません。

P.S この方法で使いたい属性がいくつかある場合、これはあまりDRYではありません。 シンボルの配列、確定的メソッド名、およびclass_evalブロックを使用して、このプロセスを一度に複数のシンボルに適用できます。

警告

ここではレールの内部構造をいじっています。 それがどのようにして他のものを失敗させる可能性があるのか​​はわかりません。 私はsaveとto_json以上のテストはしていませんが、どちらも属性ハッシュに列名でもないキーが含まれている場合に動作します。 だからあなた自身の責任でそれを使ってください。


2


`+ to_json(:methods ⇒ [:event_oid])+`はどうですか、それは機能しますか?


2


その場合は#to_jsonを自分で実装するだけです。

クラスLocation <ActiveRecord :: Base def to_json(options = {})options [:メソッド] || = []オプション[:メソッド] <<:event_oid


0


FrançoisBeausoleil’s answerを試し、 `+ to_json `を ` as_json +`に変更して動作するようにしました

def as_json(options={})
  options[:methods] ||= []
  options[:methods] << :class_to_s
  super(options)
end


0


location.to_json(:methods =>:event_oid)

ここに説明されているように:http://apidock.com/rails/ActiveRecord/Serialization/to_json

コントローラでは単に使用します:

format.json {jsonをレンダリングする:@ location.to_json(:methods =>:event_oid)}