У меня есть приложение Rails 3, к которому я добавляю JSON API.У нас есть модель Vendor
ActiveRecord и модель Employee
ActiveRecord.Employee
принадлежит Vendor
.В API мы хотим включить Employee
Vendor
в сериализацию 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)
, чтобы переименовать Employee
в DudeWhoWorksHere
в JSON.Но как насчет включенных ассоциаций?Я попробовал несколько вещей без успеха:
# :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-й способ сделать то, что я хочу.Есть идеи?