Jqgrid Rails 3.1控制器中响应json的急切加载

Jqgrid Rails 3.1控制器中响应json的急切加载,jqgrid,ruby-on-rails-3.1,Jqgrid,Ruby On Rails 3.1,以下是我目前掌握的情况: 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

以下是我目前掌握的情况:

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
事实证明,我不必首先运行查询——它只是响应json请求的一部分。我应该先仔细阅读as_json规范!以下是我的控制器操作中的解决方案:

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

它呈现所有内容,包括“派生”方法。不幸的是,这似乎产生了很多查询。这提供了我想要的json字符串,但这是最好的方法吗?希望听到任何改进的方法。

您可以将这些列选择到事件记录中,如下所示:

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方法。您必须解决该方法名称冲突。

我在问题中添加了控制器代码,以进一步澄清问题。我已经获得了所需的json字符串,如我编辑的答案中所述-但获得它感觉不太正确。。。
Event.includes(:shows).joins(:shows).select("events.*, MIN(shows.date) as start_date, MAX(shows.date) as end_date").all