2012-11-19 192 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

完美的解决方案。 –

相关问题