【问题标题】:Rails: ActiveRecord::StatementInvalid Debug (postgreSQL)Rails:ActiveRecord::StatementInvalid 调试 (postgreSQL)
【发布时间】:2012-11-19 07:20:35
【问题描述】:

这让我很难调试。在我从 SQLite3 迁移到 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

感谢所有帮助!

【问题讨论】:

  • Postgres 中的ORDER BY 似乎不接受ORDER BY LIKE field 表示法。
  • 是的,我假设了类似的事情。但那我该如何解决呢?
  • 在这种情况下,我对like 表示法并不十分熟悉。如果你只使用order: desc会有什么区别?
  • like 是您表中的一列吗?如果是,则需要用双引号将其括起来,因为它是保留字。

标签: ruby-on-rails ruby postgresql


【解决方案1】:

LIKE is an operator 所以你不能将它用作列名,除非你用双引号引起来:

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

每当 ActiveRecord 在某些 SQL 中生成列名时,它都会为您引用列名;所以.where(:like => 11) 将作为where "like" = 11 发送到数据库,每个人都很高兴。当您在 SQL sn-p 中写入列名时(例如.where('"like" = ?', 11)),您必须将其用双引号引起来以将其与模式匹配运算符区分开来。如果将列重命名为不与关键字冲突的名称(例如 likesnumber_of_likes),您会更开心

【讨论】:

    猜你喜欢
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多