1

Rails 3 jquery autocomplete gemが整数型の列で機能しないのはなぜですか。

ところで、列名コードがあります。

autocomplete :category, :code

コードは整数ですが、オートコンプリートを実装しようとすると、機能しません。

cast_to_text問題の参加者が解決しようとした: https://github.com/greg-barnett/rails3-jquery-autocomplete/blob/13d20b087f261690553dff268ff39bb6893ddaa3/lib/rails3-jquery-autocomplete/orm/active_record.rb

しかし、それも機能していないため、実際の使用方法がわかりません。

意見:

<%=f.autocomplete_field :category_id, autocomplete_category_code_project_procurement_management_plans_path, class:'cat-code',:full => true%>

PS:コードは私の自己宣言された主キーです。

set_primary_key "code"

そのため、コードを整数に変更する必要がありますが、オートコンプリートはそれと互換性がないようです。

Chromeの「要素の検査」機能によると。

ネットワーク ログ:

/project_procurement_management_plans/autocomplete_category_code で ActiveRecord::StatementInvalid======================================= ================================================== =======> PG::Error: ERROR: function lower(integer) does not existLINE 1: SELECT categories.code FROM "categories" WHERE (LOWER(cate...
^HINT: 指定された名前に一致する関数はありませんおよび引数の型明示的な型キャストを追加する必要がある場合があります。 .11/lib/active_record/connection_adapters/abstract_adapter.rb、291行目 -------------------------------------------------- -------------------------------------------------- --------ruby 286 raise exception 287 end 288 289 def translate_exception(e, message) 290 # override in derived class> 291
ActiveRecord::StatementInvalid.new(message) 292 end 293
294 end 295 end 296 end
アプリのバックトレース-------------完全なバックトレース-------------- - (gem) activerecord-3.2.11/lib/active_record/connection_adapters/abstract_adapter.rb :291: translate_exception' - (gem) activerecord-3.2.11/lib/active_record/connection_adapters/postgresql_adapter.rb:1145:in translate_exception で' - (gem) activerecord-3.2.11/lib/active_record/connection_adapters/abstract_adapter.rb:284: rescue in log' - (gem) activerecord-3.2.11/lib/active_record/connection_adapters/abstract_adapter.rb:275:in ログで' - (gem) activerecord-3.2.11/lib/active_record/connection_adapters/postgresql_adapter.rb :661:in exec_query' - (gem) activerecord-3.2.11/lib/active_record/connection_adapters/postgresql_adapter.rb:1248:in select' - (gem)

等々。

任意の回避策をいただければ幸いです。

4

1 に答える 1

1

エラー メッセージをよく見ると、問題は次の SQL にあることがわかります。

SELECT categories.code
FROM "categories"
WHERE (LOWER(categories.code) ILIKE '100%')
ORDER BY categories.code ASC
LIMIT 10

特に、PostgreSQL はその LOWER 呼び出しを好まない:

関数 lower(integer) は存在しません

categories.codeが数値の場合、生成された SQL には 2 つの問題があります。

  1. 数字を小文字にすることはできません。数字を小文字にすることは意味がありません。
  2. 数値を ILIKE することはできません。LIKE と ILIKE は文字列用です。

コードを読むと、このオプションを使用する:cast_to_textと次のようなクエリになることがわかります。

SELECT categories.code
FROM "categories"
WHERE (LOWER(CAST(categories.code AS TEXT)) ILIKE '100%')
ORDER BY categories.code ASC
LIMIT 10

これはcode数値から文字列に変換され、思いのままに文字列を LOWER および ILIKE することができます。

では、どのように使用するの:cast_to_textでしょうか? 詳細なマニュアル:fullには、オプションの次の例が含まれています。

class ProductsController < Admin::BaseController
  autocomplete :brand, :name, :full => true
end

したがって、おそらく次のことができます。

autocomplete :category
autocomplete :code, :cast_to_text => true

そして物事はうまくいくでしょう。:cast_to_textまた、マニュアルには他のオプションと一緒に言及されていないことに気付くかもしれません。そのため、自分でパッチを当てる必要があるかもしれません。

私はこの宝石を自分で使用していないので、ここでは当て推量が行われています。


オートコンプリート gem が列小文字化し、大文字と小文字を区別しないパターン マッチを実行する理由は謎です。私たちはそのすべての奇妙さに首を横に振っても問題なく、それを見なかったふりをすることができます。

于 2013-03-23T06:06:14.507 に答える