1

rails3-jquery-autocomplete gemを使用して、フィールド(製品)をレール3アプリケーションのフォームに自動完成します。ユーザーは製品名を入力するか、製品コードを入力します。どちらも製品表の文字列です。 すべてが標準の500 Herokuのエラーでローカルに正常に動作しますが、Herokuの上のAjaxリクエストがクラッシュ:Rails Autocompleteはローカルでは動作しますが、おそらくMySQL/Postgreの問題ではありません

We're sorry, but something went wrong (500) 

私はこれがpostgre/SQLの問題かもしれないと思う - 私は開発のために、ローカルのMySQL使用しますが、Herokuのはpostgre上で実行されますSQLデータベース、と私はAJAXオートコンプリートリクエストによってcallesを取得する機能で次のクエリをやっていることは:

:ローカル

def get_autocomplete_items(parameters) 
    items = Product.select("DISTINCT CONCAT_WS(' ', product_code, title, id) AS full_name, product_code, title, id").where(["CONCAT_WS(' ', product_code, title) LIKE ?", "%#{parameters[:term]}%"]) 
    end 

、これは私に一致するすべてのproduc_idsと名を含むJSON形式の配列を返します

[{"id":"9","label":"xt-pnt-dress_45 - Catherine Malandrino","value":"xt-pnt-dress_45 - Catherine Malandrino"}, ... ] 

誰かがherokuまたは他のアイデアに準拠するようにそのクエリを変更する方法があれば、本当に感謝しています。どうも。

答えて

3

HerokuはPostgreSQL 8.3 for shared databases and 9.0 for dedicated databasesを使用します。 version 8.3version 9.0concat_wsという機能を持っていません。その機能はversion 9.1+でのみ利用できます。

あなたはかかわらず、手で文字列を連結することができます:product_codetitleのどれも限り動作します

items = Product.select("DISTINCT product_code || ' ' || title || ' ' || id AS full_name, product_code, title, id").where(["product_code || ' ' || title LIKE ?", "%#{parameters[:term]}%"]) 

、およびidはNULLです。 NULLがある場合は、COALESCE(例:COALESCE(product_code || ' ', ''))をラップして空の文字列にすることができます。

また、あなたはRubyでfull_nameの世話をすることができます:

def full_name 
    [product_code, title, id].reject(&:blank?).join(' ') 
end 

とLIKEのための別の生成された列を持っているか、などで両方の列を確認してください。

where('product_code LIKE ? OR title LIKE ?', "%#{parameters[:term]}%", "%#{parameters[:term]}%") 
where('produce_code LIKE :pat OR title LIKE :pat', :pat => "%#{parameters[:term]}%") 

また、あなたがすべきMySQLのLIKEは大文字と小文字を区別しませんが、PostgreSQLの方が混乱を避けるためにすべてをダッシュ​​ダウンする必要があるわけではないことに注意してください。

where('LOWER(product_code) LIKE :pat OR LOWER(title) LIKE :pat', :pat => "%#{parameters[:term].downcase}%") 

|| is a logical-OR in MySQL以降、Rubyで3つの文字列を結合しています。 def full_name)、個別のダウンケースのLIKEを使用してproduct_codetitleをチェックすることは、おそらく最もクリーンなポータブルソリューションです。

開発環境をPostgreSQLに切り替えることもお勧めです。展開環境とバージョンを一致させることもお勧めです。トラブルを引き起こす他の違いがあります。

+0

この詳細な回答をいただきありがとうございます - それだけでなく、トピックに関する多くの背景情報と、ベストプラクティスのためのヒント - スーパー! – tmaximini

+0

私は、文字列のタイトルと商品コードを連結する仮想属性を作成すると、私はそれを再確認しました。 'full_name'を検索したいのですが、 'ActiveRecord :: StatementInvalid:Mysql :: Error:不明な列'の 'where句'にあります:SELECT 'products'。* FROM' products' WHERE(LOWER(full_name) )LIKE '%ib%') 'エラー。 – tmaximini

+0

@frank:もう1つの方法は、検索可能な列を連結することです( 'before_save'コールバックがここで使用されます)。次に、そのファイルを検索するだけです。 –

関連する問題