0

開発中にSQLite3データベースを使用していますが、アプリをホストするためにherokuを使用し始めました。Herokuは、GEMファイルで変更したPostgreSQLのみをサポートします

group :development, :test do
 gem 'sqlite3'
end
group :production do
  gem 'pg'
end

これで、日付を照会するときを除いて、すべてが正常に機能しています。このエラーが発生します。

    ActionView::Template::Error (PG::Error: ERROR:  invalid input syntax for type date: ""
2012-09-12T10:03:03+00:00 app[web.1]: 
2012-09-12T10:03:03+00:00 app[web.1]: LINE 1: ...-12' AND '2012-09-12' OR DATE(start_date) BETWEEN '' AND '')...
2012-09-12T10:03:03+00:00 app[web.1]:                                                              ^
2012-09-12T10:03:03+00:00 app[web.1]:     137: <% if @project_search.total_entries > 0 %>
2012-09-12T10:03:03+00:00 app[web.1]:     136: 
2012-09-12T10:03:03+00:00 app[web.1]: : SELECT COUNT(*) FROM "projects"  WHERE (client LIKE '%%' AND industry LIKE '%%' AND role LIKE '%%' AND tech LIKE '%%' AND business_div LIKE '%%' AND project_owner LIKE '%%' AND exception_pm LIKE '%%' AND status LIKE '%%' AND (DATE(start_date) BETWEEN '2011-09-12' AND '2012-09-12' OR DATE(start_date) BETWEEN '' AND '') AND keywords LIKE '%%')):
2012-09-12T10:03:03+00:00 app[web.1]:     138: <% if @search_performed %>
2012-09-12T10:03:03+00:00 app[web.1]:     140: <style>
2012-09-12T10:03:03+00:00 app[web.1]:     139:

これが私のproject.rbです。これは、何かを変更する必要がある場所だと思います。

class Project < ActiveRecord::Base
  attr_accessible :edited_first_name, :edited_last_name, :first_name, :last_name, :business_div, :client, :customer_benifits, :edited_date, :end_date, :entry_date, :exception_pm, :financials, :industry, :keywords, :lessons_learned, :project_name, :project_owner, :role, :start_date, :status, :summary, :tech

#validates_presence_of :business_div, :client, :customer_benifits, :end_date, :exception_pm, :financials, :industry, :keywords, :lessons_learned, :project_name, :project_owner, :role, :start_date, :status, :summary, :tech



def self.search(search_client, search_industry, search_role, search_tech, search_business_div, search_project_owner, search_exception_pm, search_status, search_start_date_dd, search_start_date_A, search_start_date_B,  search_keywords) 
  return scoped unless search_client.present? || search_industry.present? || search_role.present? || search_tech.present? || search_business_div.present? || search_project_owner.present? || search_exception_pm.present? || search_status.present? || search_start_date_dd.present?  || search_start_date_A.present?  || search_start_date_B.present?  || search_keywords.present?


todays_date = DateTime.now.to_date

if !search_start_date_A.blank? or !search_start_date_B.blank?
    search_start_date_A = Date.parse(search_start_date_A).strftime("%Y-%m-%d")
    search_start_date_B = Date.parse(search_start_date_B).strftime("%Y-%m-%d")
    todays_date = ""
    end

if search_start_date_dd.blank?
    todays_date = ""
end


if (search_start_date_A.blank? or search_start_date_B.blank?) and search_start_date_dd.blank?

where(['client LIKE ? AND industry LIKE ? AND role LIKE ? AND tech LIKE ? AND business_div LIKE ? AND project_owner LIKE ? AND exception_pm LIKE ? AND status LIKE ? AND keywords LIKE ?', 
      "%#{search_client}%", "%#{search_industry}%" , "%#{search_role}%" , "%#{search_tech}%" , "%#{search_business_div}%" , 
      "%#{search_project_owner}%" , "%#{search_exception_pm}%" , "%#{search_status}%", 
       "%#{search_keywords}%"
    ])

else

where(['client LIKE ? AND industry LIKE ? AND role LIKE ? AND tech LIKE ? AND business_div LIKE ? AND project_owner LIKE ? AND exception_pm LIKE ? AND status LIKE ? AND (DATE(start_date) BETWEEN ? AND ? OR DATE(start_date) BETWEEN ? AND ?) AND keywords LIKE ?', 
      "%#{search_client}%", "%#{search_industry}%" , "%#{search_role}%" , "%#{search_tech}%" , "%#{search_business_div}%" , 
      "%#{search_project_owner}%" , "%#{search_exception_pm}%" , "%#{search_status}%", 
      search_start_date_dd, todays_date , search_start_date_A, search_start_date_B, "%#{search_keywords}%"
    ])
end
end


def self.paginated_for_index(projects_per_page, current_page)
    paginate(:per_page => projects_per_page, :page => current_page)
  end

end

SQLite3は''を空の日付として処理できるようですが、PGは処理できません

誰かがこれに対する解決策を持っていますか?

私はレールに慣れていないので、答えるときはこれを覚えておいてください。前もって感謝します。

4

1 に答える 1

3

NULL''(空の文字列)は別のものです。MySQLや明らかにSQLiteのようないくつかのデータベースでは、それらを同じものとして扱うことができますが、そうではありません。''有効な日付ではありません。PostgreSQLは、別の一般的なMySQL-ismも受け入れません0000-00-00。プレースホルダーまたは「無効な」値として使用することに慣れている場合は、そのことに注意してください。

NULLnullの日付を送信するように、アプリケーションを修正する必要があります。日付をtoではなくアプリケーションレベルのnull/nil値(Rubynilがnull値として使用しているようです)に設定する""と、うまくいくと思います。

于 2012-09-12T10:34:27.947 に答える