Объектные отношения Rails и рендеринг JSON - PullRequest
43 голосов
/ 12 августа 2010

Отказ от ответственности, я очень мало знаю о Rails. Я постараюсь быть кратким. Учитывая следующие модельные отношения в Rails:

class ModelA < ActiveRecord::Base
  belongs_to :ModelB

...

class ModelB < ActiveRecord::Base
    has_many :ModelA

При вызове действия show контроллера ModelA возвращаемый JSON должен показывать все ObjectAs, являющиеся дочерними для ObjectB, для которого рассматриваемый ObjectA является дочерним.

Так что, если у меня есть ObjectB, который содержит ObjectA с ID 1, 2 и 3, а затем доступ: /modela/1.json

Я должен увидеть:

{
  "modelb": {
    "id": "1",
    "modela": [insert the ModelA JSON for ID's 1, 2 and 3]
  }
}

Ответы [ 2 ]

109 голосов
/ 12 августа 2010

По умолчанию вы получите только JSON, который представляет modelb в вашем примере выше. Но вы можете указать Rails включить и другие связанные объекты:

def export
  @export_data = ModelA.find(params[:id])
  respond_to do |format|
    format.html
    format.json { render :json => @export_data.to_json(:include => :modelb) }
  end
end

Вы можете даже сказать, чтобы исключить определенные поля, если вы не хотите видеть их в экспорте:

render :json => @export_data.to_json(:include => { :modelb => { :except => [:created_at, updated_at]}})

Или, включите только определенные поля:

render :json => @export_data.to_json(:include => { :modelb => { :only => :name }})

И вы можете вкладывать их так глубоко, как вам нужно (допустим, у ModelB также есть_MannyC):

render :json => @export_data.to_json(:include => { :modelb => { :include => :modelc }})

Если вы хотите включить несколько дочерних ассоциаций моделей, вы можете сделать следующее:

render :json => @export_data.to_json(include: [:modelA, :modelB, :modelN...])
2 голосов
/ 01 июня 2016

Если вы хотите более гибкий подход к рендерингу json, вы можете использовать gem jbuilder: https://github.com/rails/jbuilder

Он позволяет вам визуализировать пользовательские атрибуты, переменные экземпляра, ассоциации, повторно использовать частичные json удобным способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...