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