私はJSON APIを追加する既存のRails 3アプリケーションを持っています。我々はVendor
ActiveRecordモデルとEmployee
ActiveRecordモデルを持っています。 Employee
はVendor
に属します。 APIでは、Employee
のVendor
をJSONシリアライゼーションに含めたいと考えています。例:Rails JSONのシリアル化でモデルアソシエーション属性の名前を変更しますか?
# Employee as JSON, including Vendor
:employee => {
# ... employee attributes ...
:vendor => {
# ... vendor attributes ...
}
}
これで十分です。しかし、公開APIが内部モデル名を公開しないというビジネス要件があります。つまり、Vendor
モデルが実際にBusiness
と呼ばれているように見える必要があり、外の世界に、次のとおりです。
# Employee as JSON, including Vendor as Business
:employee => {
# ... employee attributes ...
:business => {
# ... vendor attributes ...
}
}
これは、トップレベルのオブジェクトに対して行うのは簡単です。つまり、@employee.as_json(:root => :dude_who_works_here)
に電話して、JSONのEmployee
からDudeWhoWorksHere
に名前を変更できます。しかし、付属の団体はどうですか?私は成功せず、いくつかのことを試してみました:私が持っている
# :as in the association doesn't work
@employee.as_json(:include => {:vendor => {:as => :business}})
# :root in the association doesn't work
@employee.as_json(:include => {:vendor => {:root => :business}})
# Overriding Vendor's as_json doesn't work (at least, not in a association)
# ... (in vendor.rb)
def as_json(options)
super(options.merge({:root => :business}))
end
# ... elsewhere
@employee.as_json(:include => :vendor)
唯一の他のアイデアは、手動でキーの名前を変更するために、このようなものです:
# In employee.rb
def as_json(options)
json = super(options)
if json.key?(:vendor)
json[:business] = json[:vendor]
json.delete(:vendor)
end
return json
end
しかし、それは洗練ようです。私は、より洗練された、より多くのRails-y方法が私が望むことをすることを望んでいます。何か案は?
これは私が恐れていたことです... – thefugal