2011-06-08 39 views
2

我得到了一個postgreSQL錯誤,在我沒有在本地計算機上使用postgreSQL的本地。Rails 3在Heroku上的postgreSQL查詢問題 - 布爾與複選框參數='on'

我有一個帶複選框和帶有布爾型字段的模型的搜索表單。當我選中該框以查找已完成的所有報告時,表單將傳遞參數值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 

回答

1

這可能是由於Postgres版本不匹配造成的。 'on'成爲Postgres 8.4中布爾字段的有效值,所以我猜Heroku仍然在8.3。您只需確保將true或false傳遞給查詢即可。

就測試而言,確實可以設置臨時環境。您可以按照本文設置兩個用於生產/分期的git遙控器:http://devcenter.heroku.com/articles/multiple-environments

或者您可以設置一個單獨的臨時應用程序,並使用heroku_san來處理您的兩個應用程序。

+0

啊,很高興知道。 – 2011-06-08 02:29:25

+0

感謝您的回答。我在我的電腦上運行postgreSQL v9.0.3。如果我要開發混合不同的rails應用程序,在任何一個heroku共享數據庫或專用數據庫上運行,你對於如何設置我的系統有任何建議嗎?ie。我可以在同一臺計算機上運行postgreSQL v8.3和v9,還是有更好的方法來開發和部署相同的數據庫?我有一個mac/os x雪豹。 – Daniel 2011-06-08 03:33:27

+0

我想你必須安裝Postgres的兩個版本才能使環境儘可能相似。我沒有試圖自己做,但我認爲它應該是可能的。我只是儘量避免數據庫特定的查詢,並儘可能使用ActiveRecord來構建查詢。 – 2011-06-08 04:14:45

0

您需要定義的複選框的選中,並檢查值,這樣的事情:

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

哎呀我又這麼做了:( – David 2011-06-08 02:26:00