2015-04-25 43 views
0

我有一個在Heroku上使用PostgreSQL的Rails 4.0 APP。我試圖顯示一個表,它是我的XLog或事務日誌,以updated_at timestamp的倒序顯示最後五個條目。這在我的本地系統上正常工作。當我將它推到Heroku時,它分類錯誤。使用Heroku,Rails排序在updated_at時間戳列上不正確

我檢查了Heroku數據庫定義,並將該列正確列爲時間戳。我已將Heroku代碼克隆回到我的機器,並驗證它與我推送的相同。此時,我不知道爲什麼Heroku在本地工作時不起作用。和建議,將不勝感激。

FWIW,遠程數據庫和本地數據庫沒有相同的數據。

的代碼是:(加入log_sort的最後一行作爲一個斷點,將仍然傳遞正確的結果)

def self.last_objects object, count 
    logs = XLog.where(object: object).last(count) 
    log_sort = logs.sort_by{|log| log.updated_at}.reverse 
    log_sort 
    end 

在執行過程中的斷點,可以看到變量傳遞:

Code

這是本地的結果與正確的排序:

Local result

這是Heroku的使用不正確的排序結果:

Heroku result

這是的updated_at Heroku的PostgreSQL的表定義:

PostgreSQL table

編輯:查看:

<% xlog = xlog_last(car.stock_number, 5) %> 
... 
<% xlog.each do |log| %> 
    <tr> 
     <td><%= log.associate %></td> 
     <td><%= log.proxy  %></td> 
     <td><%= log.action  %></td> 
     <td><%= log.status  %></td> 
     <td><%= log.message %></td> 
     <td><%= log.value  %></td> 
     <td><%= log.updated_at %></td> 
    </tr> 
<% end %> 

幫手:

def xlog_last(object, count) 
    XLog.last_objects object, count 
    end 

編輯: 我修改sort_by如下使用的順序方法。結果完全沒有改變。發生同樣的錯誤排序和完全相同的數據顯示在完全相同的方式:

新代碼:

def self.last_objects object, count 
    logs = XLog.where(object: object).order(updated_at: :desc).first(count) 
end 
+0

而且你肯定顯示你已經排序的時間戳(例如沒有創建)? –

+0

@FrederickCheung是的。添加視圖。 –

+0

xlog設置爲什麼? –

回答

0

一顆寶石錯誤地排列了視圖。糾正該問題解決了問題。仍然不確定爲什麼它沒有在測試中顯示,除了可能的數據差異。

0

我相信你需要使用order影響實際的SQL查詢。現在您正在使用sort_by,它在您從數據庫讀入數據後對數據進行排序。數據庫中的順序取決於它的插入方式,可能與heroku和本地系統不同。當您從heroku導出,然後導入時,表格的排序可能也會發生變化。

+0

如果是這樣的話,它可能會影響我的記錄選擇,但它應該不會影響記錄的順序,因爲它們顯示,這是我的問題。正確?而且,由於它是一個日誌,因此該表不會被加載,而是由事務生成,因此最後一個物理五個記錄應該是時間戳的最後記錄。 –

+0

正確,我無法解釋您檢索到的記錄的排序順序。我會試着在我自己的一張桌子上嘗試一下heroku ... – Derek

+0

我在heroku上的其中一張桌子上試過,它使用'sort_by'標準'updated_at'字段,類型爲'timestamp without time zone',並對它進行排序正好。我曾經對heroku上的一個數據庫有過奇怪的問題(我不記得具體是什麼),但是我將它遷移到了一個新的heroku數據庫,它解決了我的問題。如果沒有其他解決方案,也許這是可以嘗試的。 – Derek