2014-03-06 40 views
2

我正在構建的應用程序的一部分是API。最近的變化意味着我需要將兩個不同版本的數據放到我的json feed中。我認爲最好的辦法是在數據庫中進行必要的更改,然後創建一個虛擬屬性來連接數據。在選擇查詢中返回虛擬屬性

在我的模型我有沒有問題,使用<%= @event.event_summary =>在視圖中輸出EVENT_SUMMARY虛擬屬性:

def event_summary 
    "#{title} (#{start_datetime.strftime('%A %d %b, %l:%M%P')})" 
end 

在我的API控制器我有一個選擇查詢,它得到我需要的API響應屬性(這裏的簡化版本):

respond_to :json 

def index 
    respond_with Event.select('title, event_summary') 
end 

的問題是,它總是會返回一個未定義的列錯誤:

PG::UndefinedColumn: ERROR: column "event_summary" does not exist LINE 1: SELECT title, event_summary FROM "events" 

我也試過以下,但得到了同樣的結果:

respond_with Event.select('title', :event_summary) 

我使用Postgres的,如果有什麼差別。

有沒有辦法做到這一點?

謝謝!

回答

0

我想這可能會做你想要什麼:

def index 
    render :json => Event.all.to_json :methods => :event_summary 
end 

[編輯]

IIRC respond_with不to_json工作,所以你必須使用渲染

+0

這正是我所期待的。謝謝! – samlester

3

你不能在select方法中使用虛擬屬性是因爲它將轉換爲SQL語句,並且該字段在表中不存在。但是,您可以,做級聯和日期格式在SQL:

Event.select('title, (title || ' ' || to_char(start_datetime, 'HH12:MI:SS')) as event_summary') 

這實際上將創建一個「虛擬屬性」,但在SQL土地,這將是由to_char Postgres的方法返回的事件與屬性的存在和格式化。日期格式並不完全符合您的要求,因此您需要根據需要調整它(通過更改格式字符串'HH12:MI:SS'),詳情請參閱文檔:http://www.postgresql.org/docs/8.2/static/functions-formatting.html

希望有所幫助。

+1

這正是我尋求的答案 – nathanengineer