3

アクティブモデルシリアライザのbelongs_toおよびhas_oneアソシエーションのアトリビュートにアソシエーション名の接頭辞を付け、それをモデルの即時属性として直列化する必要があります。私はそれらを入れ子にしたくない、 モデルの下に同じレベルでフラットにしてください。例えばアクティブモデルシリアライザのモデルの属性(ネストなし)としてのアソシエーションの属性

、上記のシリアライザのために

class StudentSerializer 
    attributes :name, :email 
    belongs_to :school 
end 

class SchoolSerializer 
    attributes :name, :location 
end 

、出力は

{ 
    id: 1, 
    name: 'John', 
    email: '[email protected]', 
    school: { 
    id: 1, 
    name: 'ABC School', 
    location: 'US' 
    } 
} 

になります。しかし、私は追加することによってこれを行うことができます

{ 
    id: 1, 
    name: 'John', 
    email: '[email protected]', 
    school_id: 1, 
    school_name: 'ABC School', 
    school_location: 'US' 
} 

、としてそれを必要としますシリアライザへの方法は、

attributes :school_id, :school_name, :school_location 

def school_name 
    object.school.name 
end 

def school_location 
    object.school.location 
end 

しかし、私は関連のすべての属性のメソッドを定義する必要があるので、それは「素晴らしい」解決策ではないと思います。どのアイデアや回避策(または私が行方不明の場合は直接解決策)これをエレガントに達成するには? TIA。

更新: 私はこれを、それぞれの関連付けに対して次の回避策で一時的に処理しました。

attributes :school_name, :school_location 

[:name, :location].each do |attr| 
    define_method %(school_#{attr}) do 
    object.school.send(attr) 
    end 
end 

答えて

0

あなたが欠落している方法として、仮想属性を管理できます。

attributes :school_id, :school_name, :school_location 

    def method_missing(name, *_args, &_block) 
    method = name.to_s 
    if method.start_with?('school_') 
     method.slice! 'school_' 
     object.school.send(method) 
    end 
    end 

    def respond_to_missing?(name, include_all = false) 
    return true if name.to_s.start_with?('school_') 
    super 
    end 
+0

おかげ@mat!私の友人は同じアイデアを提案しましたが、もっと多くの団体があればどうなりますか? 'belongs_to:class'と同じですか?私は、belongs_toとhas_oneのアソシエーション名の配列を維持し、値をチェックして返すためにそれらをループする必要があります。流れが複雑になる。 :-( – vijay

関連する問題