2015-08-23 3 views
0

У меня есть действие контроллера (favorites) в моем приложении Rails, которое возвращает объект JSON с двумя ключами (companies и jobs). Каждый ключ представляет собой набор объектов Company или JobDescription. Я хочу знать, если есть чистый способ, я могу сериализовать как @companies, так и @jobs. Вот мой код:ActiveRecord сериализует сразу две разные модели

def favorites 
    @companies = current_user.companies 
    @jobs = current_user.job_descriptions 

    respond_to do |format| 
     format.html 
     format.json { render json: {companies: @companies, jobs: @jobs}, root: false } 
    end 
end 

Я всегда мог реорганизовать свой код в два отдельных вызова JSON (один для рабочих мест, один для компаний), но я предпочел бы придерживаться одного вызова favorites.

ответ

1

Вы можете использовать презентаторы Rails здесь!

Таким образом, вы можете иметь два оратора: CompaniesPresenterJobsPresenter и которые будут отвечать за строительство @companies и jobs объектов соответственно.

Таким образом, в вашем контроллере, вы бы что-то вроде:

@companies = CompaniesPresenter.new(current_user).companies 
@jobs = JobsPresenter.new(current_user).job_descriptions 

Например, ваш CompaniesPresenter будет выглядеть следующим образом:

class CompaniesPresenter 
    attr_reader :current_user 

    def initialize(current_user) 
    @current_user = current_user 
    end 

    def companies 
    # build the companies JSON here 
    end 
end 

Here учебник с Rails Presenter шаблон, который может быть полезным.

И, here - полезное видео. Надеюсь это поможет.

0

Этот пример работает, вы просто пытаетесь изменить формат json? Если это так ...

В компании или модели работы вы можете добавить метод as_json и форматировать вывод так, как хотите.

def as_json(options = {}) 
    { :name => name } 
end 
Смежные вопросы