Доброго времени суток.
ENV: ruby 2.4.1, Rails 5.1, active_model_serializer
Имеются две модельки:
class Country < ApplicationRecord
has_many :cities
end
class City < ApplicationRecord
belongs_to :country
end
У обеих моделей есть поля title_en и title_ru, в которых хранятся названия на англицком и русском языках соответственно. Необходимо в зависимости от используемой локали рендерить определенные поля.
Возьмем для примера контроллер
class CitiesController < ApiController
def show
render json: City.find(params[:id]), locale: I18n.locale
end
end
И сериализатор
class CitySerializer < ActiveModel::Serializer
attributes :id, :title
belongs_to :country
def title
case @instance_options[:locale]
when 'ru'
object.title_ru
when 'en'
object.title_en
end
end
end
Сериализатору передается параметр locale, в зависимости от которого выдается нужный title, но при этом рендерятся все поля модели Country.
Запрос:
localhost:3000/en/v1/cities/1{
"id": 1,
"title": "Moscow",
"country": {
"id": 1,
"title_en": "Russia",
"title_ru": "Россия",
"created_at": "2017-10-12T17:14:31.971Z",
"updated_at": "2017-10-12T17:14:31.971Z"
}
}
Каким образоем можно отрендерить только определенные поля связанной модели в зависимости от локали?
Есть "безголовый вариант":
Добавить в сериализатор:
def country
case @instance_options[:locale]
when 'ru'
{ country_id: object.country.id, title: object.country.title_ru }
when 'en'
{ country_id: object.country.id, title: object.country.title_en }
end
end
Но наверняка есть более изящное решение. Заранее спасибо.