Стремительная загрузка в действие контроллера Rails 3.1, которое откликается на json - PullRequest
0 голосов
/ 24 октября 2011

Вот что у меня есть:

class Show < ActiveRecord::Base
  belongs_to :event

  # use default_scope so shows are ordered by date by default
  default_scope order("date ASC")
end

class Event < ActiveRecord::Base
  has_many :shows, :dependent => :destroy
  has_and_belongs_to_many :users

  scope :future, lambda { includes(:shows).joins(:shows).where("shows.date > ?", Date.today).group("event_id") }

  def start_date
    shows.first.date
  end

  def end_date
    shows.last.date
  end

  def ends_in_future?
    end_date > Date.today
  end
end

Я хотел бы создать действие контроллера для использования с jqGrid.Пока что использование Event.includes(:shows).all.to_a возвращает все шоу в строке JSON, но я не могу получить start_date и end_date, что довольно понятно.Можно ли получить производные / рассчитанные свойства в JSON?

Я также заметил, что показы для каждого события отсутствуют в строке JSON.Можно ли как-нибудь получить все события, дополненные объектами дочерних шоу, отображаемыми в строке JSON?

Большое спасибо, Дэни.

РЕДАКТИРОВАТЬ: Частично решил эту проблему с помощью as_json(:include => :shows)в действии контроллера.Это возвращает событие и все связанные шоу для каждого события.Осталось только выяснить, как я могу включить start_date и end_date в строку json ...

РЕДАКТИРОВАТЬ: Здесь был мой оригинальный код действия контроллера - это может быть не лучший код, так какЯ до сих пор разбираюсь в Rails:

matches = Event.includes(:shows).all
respond_to do |format|
   format.json {render :json => matches.as_json(:include => :shows)}
end

Как выяснилось, мне не нужно сначала выполнять запрос - он может быть просто частью ответа на запрос json.Сначала я должен был прочитать спецификации as_json намного ближе!Вот решение в моем действии контроллера:

respond_to do |format|
      format.json {render :json => Event.all.as_json(:include => :shows, :methods => [:start_date, :end_date])}
end

Это отрисовывает все, включая «производный» метод.К сожалению, это, кажется, вызывает много запросов.Это обеспечивает строку json, которую я хочу, но это лучший способ?Хотелось бы услышать любые улучшенные методы.

1 Ответ

1 голос
/ 24 октября 2011

Вы можете выбрать эти столбцы в записи о событии следующим образом:

Event.includes(:shows).joins(:shows).select("events.*, MIN(shows.date) as start_date, MAX(shows.date) as end_date").all

Вам может потребоваться присвоить псевдонимам эти столбцы под другим именем (например, «show_start_date», «show_end_date»), поскольку записи событий уже будут иметь методы start_date и end_date, которые вы определили. Вам придется обойти это столкновение с именем метода.

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