2011-10-23 32 views
0

這是我到目前爲止有:渴望加載在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_dateend_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字符串,但它是最好的方法嗎?很想聽聽任何改進的方法。

回答

1

你可以得到那些列選入事件的記錄,像這樣:

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方法。你必須解決方法名稱衝突。

+0

我在問題中添加我的控制器代碼以進一步闡明它 – codedog

+0

我已經實現了所需的json字符串,如我編輯的答案中所述 - 但是讓它感覺不太正確... – codedog