【问题标题】:ProtocolViolation: ERROR: bind message supplies 0 parameters, but prepared statement "" requires 1ProtocolViolation:错误:绑定消息提供 0 个参数,但准备好的语句“”需要 1 个
【发布时间】:2015-06-23 13:39:01
【问题描述】:

我正在尝试创建一个已离开 cmets 的唯一患者列表,按照最先发表最新评论的患者的顺序排列。

这是我创建列表的 Ruby .erb 代码:

@comment_list.order("created_at desc").each_with_index do |comment, index|

@comment_list 在控制器中定义为:

  @comments = current_clinician.comments.select('ON (patient_id) *').uniq
  @comments = @comments.order("patient_id, created_at DESC")
  @comment_list = Comment.select('*').from("(#{@comments.to_sql}) sub")

我收到一条 ActiveRecord::StatementInvalid 消息:

PG::ProtocolViolation: 错误:绑定消息提供 0 个参数,但准备好的语句“”需要 1 个 : SELECT * FROM (SELECT DISTINCT ON (patient_id) * FROM "cmets" WHERE "cmets"."clinician_id" = $1 ORDER BY patient_id, created_at DESC) sub ORDER BY created_at desc

我尝试关注24619117 上的答案,我的输出是这个和答案顶部29660396 的组合。

$ rails -v
Rails 4.1.8
$ ruby -v
ruby 2.2.1p85 (2015-02-26 revision 49769) [x86_64-darwin14]
$ psql --version
psql (PostgreSQL) 9.4.1

我对 PostgresSQL 缺乏经验,部分问题是我使用 Ruby on Rails 来获取 SQL,而且方法并不简单。我一直在用http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-from

请提出建议

【问题讨论】:

    标签: ruby-on-rails ruby postgresql activerecord subquery


    【解决方案1】:

    在您的情况下,似乎因为您使用的是@comments.to_sql,所以您将准备好的语句拉入您的子选择中,而没有为其引入参数。您可以尝试只包含这样的评论数据:

      @comments = current_clinician.comments.select('ON (patient_id) *').uniq.order("patient_id, created_at DESC").include(:comment)
      @comment_list = @comments.include(:comment)
    

    这个问题似乎也来自于 Rails 中构建准备好的语句的方式,可能是由 Rails 本身的问题(Rails 问题#15920,已在 Rails 4.2 中修复)或各种问题引起的有助于生成查询的 gem(例如:Rails 问题#20236),甚至是您定义模型关联的方式(Rails 问题#12852)。

    可以通过在database.yml 文件中添加指令来彻底禁用准备好的语句:

    production:
      adapter: postgresql
      database: prod_dbname
      username: prod_user
      password: prod_pass
      prepared_statements: false
    

    但首先,您可能需要检查并确保您没有在模型关联中使用不必要的参数,如下所示:

    class DashboardTab < ActiveRecord::Base
      has_many :dashboard_tab_feeds, foreign_key: :dashboard_tab_id, dependent: :destroy
      has_many :social_feeds, through: :dashboard_tab_feeds
    end
    
    class DashboardTabFeed < ActiveRecord::Base
      belongs_to :social_feed
      belongs_to :dashboard_tab
    end
    
    class SocialFeed < ActiveRecord::Base
      has_many :dashboard_tab_feeds, foreign_key: :social_feed_id, dependent: :destroy
    end
    

    ...应该省略foreign_key,像这样:

    class DashboardTab < ActiveRecord::Base
      has_many :dashboard_tab_feeds, dependent: :destroy
      has_many :social_feeds, through: :dashboard_tab_feeds
    end
    
    class DashboardTabFeed < ActiveRecord::Base
      belongs_to :social_feed
      belongs_to :dashboard_tab
    end
    
    class SocialFeed < ActiveRecord::Base
      has_many :dashboard_tab_feeds, dependent: :destroy
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 2013-08-09
      • 1970-01-01
      • 2020-06-24
      • 2017-05-14
      • 2021-08-01
      • 1970-01-01
      相关资源
      最近更新 更多