【发布时间】:2015-08-22 08:36:44
【问题描述】:
我正在运行 Rails 4,使用 rails-jquery-autocomplete gem - 我已经连接了所有东西,因此它可以很好地自动完成有 :name 列的模型。
我正在苦苦挣扎的是如何自动完成 name 它是一个实例方法。我有一个看起来像这样的模型:
class Roster < ActiveRecord::Base
belongs_to :practice
belongs_to :role
belongs_to :compensation_type
def name
self.practice.name + ' - ' + self.role.role_type.name + ' (' + self.role.name + ') - ' + self.compensation_type.name
end
end
这应该可以很容易地看到我正在尝试做什么 - 在 name 方法上自动完成。
方法本身有效:
2.2.2 :002 > roster1.name
Practice Load (0.2ms) SELECT "practices".* FROM "practices" WHERE "practices"."id" = ? LIMIT 1 [["id", 1]]
Role Load (0.2ms) SELECT "roles".* FROM "roles" WHERE "roles"."id" = ? LIMIT 1 [["id", 1]]
RoleType Load (0.2ms) SELECT "role_types".* FROM "role_types" WHERE "role_types"."id" = ? LIMIT 1 [["id", 1]]
CompensationType Load (0.3ms) SELECT "compensation_types".* FROM "compensation_types" WHERE "compensation_types"."id" = ? LIMIT 1 [["id", 1]]
=> "Test Practice - Role Name Test (Role Type Test) - Test Comp Type"
所以问题似乎是自动完成。表单加载,我可以在控制台中看到抛出了以下错误:
Started GET "/bookings/autocomplete_roster_name?term=Te" for ::1 at 2015-08-22 09:18:32 +0100
Processing by BookingsController#autocomplete_roster_name as JSON
Parameters: {"term"=>"Te"}
Roster Load (0.9ms) SELECT rosters.id, rosters.name FROM "rosters" WHERE (LOWER(rosters.name) LIKE 'ar%') ORDER BY LOWER(rosters.name) ASC LIMIT 10
SQLite3::SQLException: no such column: rosters.name: SELECT rosters.id, rosters.name FROM "rosters" WHERE (LOWER(rosters.name) LIKE 'Te%') ORDER BY LOWER(rosters.name) ASC LIMIT 10
Completed 500 Internal Server Error in 6ms (ActiveRecord: 1.4ms)
第一个明显的事情是 SQL 完全不同 - 它不是试图将三条信息放在一起并将它们组合起来,它只是在寻找 :name 列。
有没有办法使用自定义实例方法而不是实际列来完成这项工作?我可以让我的实例方法表现得像一个列吗?
为了完整起见,我的表单控制器:
autocomplete :roster, :name
在我的表格上我有:
<%= f.input :roster, as: :autocomplete, url: autocomplete_roster_name_bookings_path, id_element: '#booking_roster_id', input_html: { class: 'form-control' } %>
非常感谢任何帮助!
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-4 jquery-autocomplete