Сокращение response_with (: include => xxx) - PullRequest
2 голосов
/ 05 августа 2011

Я ищу способ сократить: include =>: child внутри response_with, который генерирует json.

Вот пример, не уверен, что это вообще возможно, но я хотел бычтобы выяснить.

В контроллере:

@p = Parent.where('id = ?', params[:id])
respond_with(@p, :include => {:child1 => {}, :child2 => {}, :child3 => {:include => :grandchild1}})

Есть ли какой-нибудь способ включить их все, когда я определяю экземпляр?

Может быть что-то вроде:

@p = Parent.includes(:child1, :child2, :child3, :grandchild1).where('id = ?', params[:id])
respond_with(@p)

По сути, я пытаюсь высушить мой код ... Я не хочу повторять ввод хэша include снова и снова ... Есть ли возможность просто включить все дочерние объекты в один вызов

1 Ответ

5 голосов
/ 06 августа 2011

ActiveRecord имеет метод as_json, который определяет, как объект должен выводиться как json. Вы можете переопределить этот метод для включения связанных потомков по умолчанию, так что-то вроде этого:

class Parent < ActiveRecord::Base

  # We went to display grandchildren by default in the output JSON
  def as_json(options={})
    super(options.merge(:include => {:child1 => {}, :child2 => {}, :child3 => {:include => :grandchild1}})
  end


end

Это должно позволить вам немного очистить свой контроллер, вам нужно только это:

@parent = Parent.find(params[:id])
respond_with @parent
...