【问题标题】:Heroku PG error, doesn't show up in developmentHeroku PG错误,没有出现在开发中
【发布时间】:2014-11-17 03:26:37
【问题描述】:

即使我的“visit_id”在我的数据库中定义为整数,我也会收到此错误。有人有什么理由吗?我的本地环境是 sqlite3 并且工作正常,但是当我推送到 heroku 时,我得到了这个……下面是我的表单代码。

PG::InvalidTextRepresentation:错误:布尔类型的输入语法无效:“visit_id”

控制器

      def show  
        @visit = Visit.find_by :visit_id

        respond_with(@payment)
      end

      def new
        @visit = Visit.find(params[:visit_id])
        @payment = @visit.build_payment
      end

      def create
        @payment = Payment.new(payment_params)
        api = UrlApi.new()
        url = api.unique_url
        @payment.update_attribute :atapi, url
        @payment.save
        if @payment.save
          respond_with(@payment)
        else
          redirect_to edit_payment_path, :alert => "Unable to update user."
        end

付款表格

    <div class="row form">
      <div class="col-sm-6 row-col">
          <div class="box">
              <!--visits form -->
              <%= bootstrap_form_for(@payment) do |f| %>
                <%= f.hidden_field :user_id, :value => current_user.id %>
                <%= f.hidden_field :visit_id %>
                <%= f.text_field :coupon_code %>
                <%= f.check_box :coupon_valid %>
                <%= f.check_box :paid %>
          </div>
      </div>

      <div class="col-sm-6">
          <div class="box">
              <%= f.text_field :atapi %>
             <%= f.select :seen, 
                 [['Yes',true],['No',false]], 
                label: "Patient seen"
                <%= f.submit %>
              <% end %>
              <div class="row submit">
                  <div class="col-md-3 right">
                  </div>
              </div>
          </div>
      </div>
    </div>

【问题讨论】:

  • 导致该错误的具体代码是什么?顺便说一句,在 SQLite 上开发和在 PostgreSQL 上部署是一个坏主意,ActiveRecord 并没有真正提供任何有用的可移植性。
  • 我没有从 heroku 日志中看到特定的错误代码?这是错误开始的第一行。我理解同时做 pg 和 sqlite3 的坏主意,我的计划是尽快将开发移植到 pg。我目前在开发这个应用程序的同时也在学习 PG,但我对它的了解还不够,无法在本地正确设置它。

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


【解决方案1】:

你的问题可能就在这里:

@visit = Visit.find_by :visit_id

由于您给find_by 提供了不是哈希的东西,它可能会在上面调用to_s 并生成如下SQL:

select visits.* from visits where visit_id limit 1

在 PostgreSQL 中,WHERE 子句的每个组件都是一个布尔值,由于 PostgreSQL 有一个真正的布尔类型,它会尝试将标识符 visit_id 解释为布尔值,但 visit_id 列是一个整数,所以你得到:

布尔类型的输入语法无效:“visit_id”

SQLite 对 SQL 的解释比 PostgreSQL 宽松一些,uses C-style integers for boolean values:

1.1 布尔数据类型

SQLite 没有单独的布尔存储类。相反,布尔值存储为整数 0(假)和 1(真)。

所以说where some_integer_column 对 SQLite 来说非常有意义。

我猜你的 show 控制器应该以:

@visit = Visit.find_by(:visit_id => params[:visit_id])

@visit = Visit.find(params[:visit_id])

【讨论】:

  • 比我聪明的人来救援!第二个修好了,谢谢你的时间!
猜你喜欢
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
  • 2016-07-09
相关资源
最近更新 更多