Rails 3 Проблема с запросом postgreSQL на Heroku - параметр логический vs флажок = 'on' - PullRequest
2 голосов
/ 08 июня 2011

Я получаю сообщение об ошибке postgreSQL на heroku, которое не отображается локально на моем компьютере, который также использует postgreSQL.

У меня есть форма поиска с флажками и модель с логическими полями.Когда я устанавливаю флажок, чтобы найти все завершенные отчеты, в форме передается значение параметра complete = '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 Log

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>

<% end%>

Модель

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

Ответы [ 2 ]

1 голос
/ 08 июня 2011

Вероятно, это связано с несовпадением версий Postgres.'on' стал допустимым значением для логических полей в Postgres 8.4, поэтому, я думаю, Heroku все еще работает на 8.3.Вам просто нужно убедиться, что вместо этого в запросе передано значение true или false.

Что касается тестирования, вы действительно можете настроить промежуточную среду.Вы можете настроить два git-пульта для производства / постановки согласно этой статье: http://devcenter.heroku.com/articles/multiple-environments.

Или вы можете настроить отдельное промежуточное приложение и использовать heroku_san для работы с двумя вашими приложениями..

0 голосов
/ 08 июня 2011

Вам нужно будет определить непроверенные и проверенные значения флажка, что-то вроде этого:

check_box(object_name, method, options = {}, checked_value = "1", unchecked_value = "0")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...