這是我到目前爲止有:渴望加載在Rails的3.1控制器動作,其responds_to JSON
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字符串呈現兒童表演實體?
非常感謝, Dany。
編輯:通過在控制器操作中使用as_json(:include => :shows)
部分解決此問題。這將返回事件和每個事件的所有相關演出。剩下的唯一一件事就是找出我怎麼能包括start_date
和JSON字符串end_date
......
編輯:這是我原來的控制器操作碼 - 它可能不是最好的代碼,因爲我仍然感覺我辦法解決的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字符串,但它是最好的方法嗎?很想聽聽任何改進的方法。
我在問題中添加我的控制器代碼以進一步闡明它 – codedog
我已經實現了所需的json字符串,如我編輯的答案中所述 - 但是讓它感覺不太正確... – codedog