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