Rails 3 Heroku 上的 postgreSQL 查询问题 - 布尔值与复选框参数 = 'on'



我在heroku上收到一个postgreSQL错误,我的计算机也使用postgreSQL,但我没有在本地得到这个错误。

我有一个带有复选框的搜索表单和一个带有布尔字段的模型。当我选中该框以查找所有已完成的报告时,表单会传递参数值completed='on'。如heroku日志所示,数据库不喜欢在其sql中使用带有布尔值的参数值。我本以为rails会以某种方式将其从"on"更改为true,不管怎样,搜索表单在本地运行良好。

如何在Heroku上使用此功能

一旦网站在Heroku上运行,如果在本地工作但在服务器上不工作的地方出现这样的问题,我该如何测试未来的更改?Heroku是否为您提供了一个测试不同版本应用程序的区域

详细信息:

本地开发日志

[1m[35mReport Load (0.8ms)[0m  SELECT "reports".* FROM "reports" WHERE ("reports"."user_id" = 1) AND (completed = 'on') LIMIT 4 OFFSET 0

Heroku日志

ActiveRecord::StatementInvalid (PGError: ERROR:  invalid input syntax for type boolean: "on"
2011-06-08T00:17:21+00:00 app[web.1]: : SELECT  "reports".* FROM "reports" WHERE  ("reports"."user_id" = 2) AND (completed = 'on') LIMIT 4 OFFSET 0):
2011-06-08T00:17:21+00:00 app[web.1]:   app/controllers/reports_controller.rb:6:in `index'

控制器

def index
  @reports = Report.accessible_by(current_ability).search(params)
  @reports = @reports.paginate :per_page => 4, :page => params[:page]
  respond_to do |format|
    format.html
    format.xml  { render :xml => @reports }
  end
end

查看

<%= form_tag(reports_path, :method => "get") do %>
<ul>    
    <li>
        <%= link_to 'Show All', reports_path %>
    </li>       
    <li>
    <%= label_tag(:report_number, "Report Number") %>
    <%= text_field_tag(:report_number,nil, :value => params[:report_number]) %>
    </li>
    <li>
    <%= label_tag(:job_number, "Job Number") %>
    <%= text_field_tag(:job_number,nil, :value => params[:job_number]) %>
    </li>
    <li>
    <%= label_tag(:has_failures, "Failures") %>
    <%= check_box_tag(:has_failures,nil, params[:has_failures]) %>
    </li>
    <li>
    <%= label_tag(:completed, "Completed") %>
    <%= check_box_tag(:completed, nil, params[:completed]) %>
    </li>
    <li>
        <%= submit_tag("Search") %>
    </li>                   
</ul>

<%结束%>

型号

def self.search(criteria)
 if !criteria[:report_number].blank?
    where("report_number = ?",criteria[:report_number])
  elsif !criteria[:job_number].blank?
    joins(:site).
    where("sites.job_number = ?",criteria[:job_number])
  else
    composed_scope = scoped
    if !criteria[:has_failures].blank?
     composed_scope = composed_scope.where("has_failures = ?",criteria[:has_failures])
   end
   if !criteria[:completed].blank?
      composed_scope = composed_scope.where("completed = ?",criteria[:completed])
   end
   composed_scope
  end
end

这可能是由于Postgres版本不匹配。'on'在Postgres8.4中成为布尔字段的有效值,所以我猜Heroku仍然在8.3上。您只需要确保在查询中传递true或false即可。

就测试而言,您确实可以设置一个临时环境。根据本文,您可以为生产/暂存设置两个git远程:http://devcenter.heroku.com/articles/multiple-environments.

或者,您可以设置一个单独的暂存应用程序,并使用heroku_san来处理您的两个应用程序。

您需要定义复选框的未检查值和已检查值,如下所示:

check_box(object_name, method, options = {}, checked_value = "1", unchecked_value = "0")

最新更新