2012-11-19 191 views
0

這給我很難調試這個。在我從SQLite3移動到PostgreSQL之前,它工作完美。對我來說奇怪的是,有另一個控制器具有幾乎相同的代碼,並且該頁面正常工作。任何人都可以幫我嗎?Rails:ActiveRecord :: StatementInvalid Debug(postgreSQL)

錯誤:

ActiveRecord::StatementInvalid in Good_posts#index 

Showing c:/ruby/mangfeel/app/views/good_posts/index.html.erb where line #3 raised: 

PG::Error: ERROR: syntax error at or near "desc" 
LINE 1: ... "good_posts".* FROM "good_posts" ORDER BY like desc LIMIT... 
                 ^
: SELECT "good_posts".* FROM "good_posts" ORDER BY like desc LIMIT 15 OFFSET 0 

good_posts_controller是造成該問題:

def index 
@good_posts = GoodPost.paginate(:page => params[:page], order: 'like desc', per_page: 15) 
@good_client_ip = request.remote_ip.encode! 'utf-8' 

respond_to do |format| 
    format.html # index.html.erb 
    format.json { render json: @good_posts } 
end 
end 

post_controller,這也有類似的代碼,但工作得很好:

def index 
@posts = Post.paginate(:page => params[:page], order: 'created_at desc', per_page: 15) 
@client_ip = request.remote_ip.encode! 'utf-8' 

respond_to do |format| 
    format.html # index.html.erb 
    format.json { render json: @posts } 
end 
end 

我很感謝所有的幫助!

+1

您喜歡錶格中的列嗎?如果是的話,你需要用雙引號括起來,因爲它是一個保留字。 –

+0

看來Postgres中的ORDER BY'不接受'ORDER BY LIKE field'表示法。 – samuil

+0

是的,我假設了一個類似的東西。但是,我將如何修復它呢? –

回答

1

LIKE is an operator所以,除非你雙引號,你不能把它作爲列名是:

@good_posts = GoodPost.paginate(... order: '"like" desc' ...) 

每當ActiveRecord的一些SQL,將引用列名稱爲您生成一個列名;所以.where(:like => 11)將作爲where "like" = 11發送到數據庫,每個人都很高興。當您在SQL片段中編寫列名時(例如.where('"like" = ?', 11)),您必須將其雙引號以將其與模式匹配運算符區分開來。如果您將列重命名爲與某個關鍵字不衝突的某些內容(如likesnumber_of_likes),您會更高興。

+0

完美的解決方案。 –

相關問題