Включить вложенные ассоциации в JSON

# Person.rb
class Person < ActiveRecord::Base
  has_many :events
end

# Event.rb
class Event < ActiveRecord::Base
  belongs_to :person
  has_many :tables
end

# Table.rb
class Table < ActiveRecord::Base
  belongs_to :event
end

В Person.rb я пытаюсь создать метод для получения всех событий и таблиц в одном запросе.

def complete_events
  events.includes(:tables)
end

Я вижу в консоли, что загружаются как события, так и таблица.

  Event Load (1.1ms)  SELECT "events".* FROM "events" WHERE "event"."person_id" = $1  [["person_id", 17]]
  Table Load (0.5ms)  SELECT "tables".* FROM "tables" WHERE "tables"."event_id" IN (10)

Однако возвращаемый объект — это только записи событий.

#<ActiveRecord::Relation [#<Event id: 1, name: "some event">]

Как я могу сделать возвращенную запись вложенной, как показано ниже?

#<ActiveRecord::Relation [#<Event id: 1, name: "some event", tables: [id: 1, seats: 4, id: 2, seats: 4]>]

Редактировать

Я могу повторить и создать объект all_events, но он не вложен.

  def complete_events
    all_events = []
    events.includes(:tables).each do |event|
      all_events << event
      all_events << event.tables
    end
    all_events
  end

person baconck    schedule 06.11.2016    source источник
comment
Вы ищете вывод JSON? Вы знаете, что можете перебирать отношение complete_events, и доступ к таблицам для событий не вызовет дополнительных запросов.   -  person SteveTurczyn    schedule 07.11.2016
comment
Да, JSON - это цель - я пытаюсь вывести все это как один вложенный объект JSON. Что у меня беда.   -  person baconck    schedule 07.11.2016


Ответы (2)


Используйте as_json:

def complete_events
 as_json(
   include: {
     events: {
       include: tables
   }
 )
end
person potashin    schedule 06.11.2016

попробуй это.

  User.all.as_json(methods:[:profile,:addresses])

здесь Пользователь — это модель, а профиль и адрес — это сопоставленная таблица, имеющая ассоциации has_many или has_one, поэтому отображаемый json будет содержать таблицу во вложенном виде следующим образом.

user : {
name:"dummy name",
     profile: {},
     addresses: {}
}

поэтому в одном объекте у вас будут все данные и связанные данные.

person Apoorv    schedule 28.04.2018
comment
Спасибо за этот фрагмент кода, который может предоставить некоторую ограниченную немедленную помощь. Надлежащее объяснение значительно повысило бы его долгосрочную ценность, показав, почему это хорошее решение проблемы, и сделало бы его более полезным для будущих читателей с другими подобными вопросами. Пожалуйста, отредактируйте свой ответ, чтобы добавить некоторые пояснения, включая сделанные вами предположения. - person Maximilian Peters; 28.04.2018