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 的“检查元素”功能。

网络日志:

ActiveRecord::StatementInvalid 在 /project_procurement_management_plans/autocomplete_category_code========================================= ==================================================== =======> PG::Error: ERROR: function lower(integer) does not existLINE 1: SELECT categories.code FROM "categories" WHERE (LOWER(cate...
^HINT: 没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。:SELECT categories.code FROM "categories" WHERE (LOWER(categories.code) ILIKE '100%') ORDER BY categories.code ASC LIMIT 10(gem) activerecord-3.2 .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:in 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_adapter/abstract_adapter.rb:284:in rescue in log' - (gem) activerecord-3.2.11/lib/active_record/connection_adapters/abstract_adapter.rb:275:in log' - (gem) activerecord-3.2.11/lib/active_record/connection_adapter/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 有两个问题:

  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数字值转换为字符串,您可以根据自己的意愿降低和喜欢字符串。

那么我们如何使用: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 回答