我有一个Employee应用程序类,每个Employee必须在应用程序中选择一个他可以使用的软件,然后我有一个使用ransack的搜索表单,但是当我按软件搜索员工应用程序时,我只想获得选择了该软件的员工应用程序,而不是返回所有员工应用程序,因为显然它没有使用该范围或ransack查询中的过滤器那么,如何使用作用域或编写正确的查询来只包含选中的记录呢?
class EmployeeSoftware < ApplicationRecord
belongs_to :employee_application
scope :selected, -> { where(selected: true) }
end
class EmployeeApplicationsController < ApplicationController
def index
@search = EmployeeApplication.ransack(q)
@employee_applications = @search.result.to_a.uniq
end
end
视图= form.select :employee_softwares_id_in, options_from_collection_for_select(employee_software_options_for_select, "id", "name", @search.employee_softwares_id_in)
知道我该怎么做吗?
更新:我设法通过视图添加字段,它将被包含在ransack查询中,不知道是否有更好的方法,但这一个工作
= form.select :employee_softwares_id_in, options_from_collection_for_select(employee_software_options_for_select, "id", "name", @search.employee_softwares_id_in)
= form.hidden_field employee_softwares_selected_eq, value: '1'
你可以在你的控制器动作中添加作用域
class EmployeeApplicationsController < ApplicationController
def index
@search = EmployeeApplication.selected.ransack(q)
@employee_applications = @search.result.to_a.uniq
end
end
或
您可以使用default_scope
,它将在每次尝试搜索时应用。
class EmployeeSoftware < ApplicationRecord
belongs_to :employee_application
default_scope -> { where(selected: true) }
end
我希望这对你有帮助。