2017-09-11 25 views
0

私はその可能であればこれらの合成属性が含まれますactiverecordハッシュに合成属性を取得する方法は?

Person.first.to_json 

のようなステートメントのように、ActiveRecordのハッシュに合成属性のカップルを取得するために知っていただきたいと思います。

attr_accessor :foo 

def foo 
    return ... #some calculated value 
end 

とモデルのオブジェクトで使用する場合それが正常に動作している間、値「fooが」属性のハッシュまたはオブジェクトを表すJSONに表示されません。私は、モデルでこのコードを使用してみました。

答えて

1

as_jsonを使用すると、シリアル化のハッシュを取得できます。これは、あなたがrender json:を呼び出すときに使用されるものである

class Person 
    def to_json 
    as_json(methods: :foo).to_json 
    end 
end 

methodsオプションは、追加のメソッドを含めることができます。

通常、ActiveModel::SerializersやjBuilderのようなシリアライゼーション層を使用する方が良いです。これは基本的にビューですが、HTMLではなくJSONを生成します。

モデルレベルでシリアル化を処理するだけで、既にmini godクラスに相当するものが増えてしまい、コンテキストに基づいて別のシリアル化が必要なときには本当に扱いにくいものになります。

0

あなたのPersonクラスでのこのメソッドは、トリックを行う必要があります。

def to_json 
    original_json = JSON.parse(super) 
    original_json['my_custom_key'] = do_something() 
    original_json.to_json 
    end 

このコードは基本的に文字列を返す、superで元のメソッドを呼び出します。その後、その文字列をハッシュに変換して、余分な値を追加します。その後、整合性のために元のメソッドと同じインターフェイスを保持するために、to_jsonメソッドでハッシュを文字列に変換します。

+0

クリエイティブですが、JSONをデコードしないでシリアライズ可能なハッシュを取得するには、 'as_json'を使用できます。 – max

関連する問題