Rails 使用实例方法自动完成?
Rails Autocomplete Using Instance Method?
我是 运行 Rails 4,使用 rails-jquery-autocomplete
gem - 我把所有东西都连接起来了,所以它可以很好地自动完成有 [= 的模型17=]列。
我正在苦苦挣扎的是如何自动完成 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
这应该可以很容易地看到我正在尝试做什么 - 名称方法的自动完成。
方法本身有效:
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' } %>
非常感谢任何帮助!
您可以自定义 autocomple
操作:
def autocomplete_roster_name
# your code here
result = Model.where('custome query here')
render json: result.to_json
end
但是您应该进行 select 查询并将其连接到数据库层。
我是 运行 Rails 4,使用 rails-jquery-autocomplete
gem - 我把所有东西都连接起来了,所以它可以很好地自动完成有 [= 的模型17=]列。
我正在苦苦挣扎的是如何自动完成 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
这应该可以很容易地看到我正在尝试做什么 - 名称方法的自动完成。
方法本身有效:
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' } %>
非常感谢任何帮助!
您可以自定义 autocomple
操作:
def autocomplete_roster_name
# your code here
result = Model.where('custome query here')
render json: result.to_json
end
但是您应该进行 select 查询并将其连接到数据库层。