2012-09-13 69 views
2

我有一個頁面,它只是顯示我的數據庫中按照voteCount排序的所有鏈接。這裏是控制器:Ruby on Rails:只有託管在heroku上,Active Record查詢才能執行。

class PagesController < ApplicationController 
    def index 
    params[:per_page] ||= 5 
    params[:page]  ||= 1 

    @links = Link.order('voteCount DESC').paginate(:page => params[:page], :per_page => params[:per_page]) 

    end 
end 

我保存查詢使用PAGINATE插件數據庫,並與加前綴:

.order('voteCount DESC') 

當我在我的本地服務器上運行此命令,它運行良好。但是,只要我將它部署到heroku,它就會失敗。這是輸出我在控制檯中,當我檢查日誌/執行:

Link Load (2.0ms) SELECT "links".* FROM "links" ORDER BY voteCount DESC LIMIT 5 OFFSET 0 
ActiveRecord::StatementInvalid: PG::Error: ERROR: column "votecount" does not exist 
LINE 1: SELECT "links".* FROM "links" ORDER BY voteCount DESC LIMI... 
               ^

我使用控制檯選中,voteCount欄肯定是存在的。這可能是由於我的本地環境運行sqlite3和heroku使我使用postgres ...

任何幫助將非常感激。謝謝。

回答

4

你有大小寫問題。當你這樣說:

create_table :links do |t| 
    t.integer :voteCount 
end 

Rails會發出這樣的SQL到PostgreSQL創建列:

"voteCount" integer 

周圍的標識符雙引號使其大小寫敏感的,這意味着你必須更多地將其稱爲"voteCount"。如果你這樣說:

.order('"voteCount" DESC') 

一切都應該工作。

SQLite不關心標識符的情況下,所以你可以說voteCount,votecount,VOTECOUNT,...在SQLite中並沒有關係。

Rails通常會引用在與PostgreSQL交談時產生的標識符。通常這並不重要,Rails約定是使用小寫字母標識符,而PostgreSQL在使用它們之前將未加引號的標識符摺疊爲小寫字母,以便默認情況下一切正常。

這裏有一些相關的最佳實踐:

  1. 開發和部署相同的堆棧。
  2. 使用小寫字母列名,並用PostgreSQL用下劃線分隔的單詞。這也恰好符合通常的Ruby約定。

我建議您使用vote_count作爲列名。

+0

非常感謝。我只是修復它。 但我切換到開發使用postgresql了。 –

1

你的Heroku應用程序可能沒有該列遷移尚未

heroku run rake db:migrate 
+0

不,我試過了,那不是問題。不管怎麼說,還是要謝謝你。 –

+0

我覺得這可能是一個區分大小寫的問題。 http:// stackoverflow。com/questions/203399/how-do-you-write-a-case-insensitive-query-for-both-mysql-and-postgres MarkR在那裏有一個很好的答案,我想在此重申:don對不同的環境使用不同的軟件堆棧。你會得到很多這些錯誤 –

+0

postgresql中的標識符是不區分大小寫的,除非它們被引用。在控制檯輸出查詢中,「voteCount」未被引用。我很困惑。 – kristianp

相關問題