dko*_*zev 31 ruby ruby-on-rails ruby-on-rails-3 activeadmin
Active Admin允许我定义索引页面上显示的过滤器,如下所示:
ActiveAdmin.register Promo do
filter :name
filter :address
filter :city
filter :state
filter :zip
end
Run Code Online (Sandbox Code Playgroud)
我想将上面的所有字段合并为一个,以便我可以搜索包含名称或完整地址中的搜索字符串的Promos.我的模型已经有一个我可以使用的命名范围:
class Promo < ActiveRecord::Base
scope :by_name_or_full_address, lambda { |q| where('name LIKE :q OR address LIKE :q OR city LIKE :q OR state LIKE :q OR zip LIKE :q', :q => "%#{q}%") }
end
Run Code Online (Sandbox Code Playgroud)
Iva*_*van 28
活动管理员使用元搜索.例如,你可以这样做:
filter :"subscription_billing_plan_name" , :as => :select, :collection => BillingPlan.all.map(&:name)
Run Code Online (Sandbox Code Playgroud)
dko*_*zev 27
Active Admin使用meta_search gem作为其过滤器.例如,ORed条件语法允许在一个查询中组合多个字段
Promo.metasearch(:name_or_address_contains => 'brooklyn')
Run Code Online (Sandbox Code Playgroud)
在Active Admin DSL中,这转换为
ActiveAdmin.register Promo do
filter :name_or_address, :as => :string
end
Run Code Online (Sandbox Code Playgroud)
小智 10
要使用自定义过滤器,您可以创建范围函数并将其作为search_methods添加到模型中.
例如,在我的用户模型上:
search_methods :role_eq
scope :role_eq, -> (role) { where("? LIKE ANY(roles)", role) }
Run Code Online (Sandbox Code Playgroud)
然后在users.rb中,我可以将我的范围用作自定义过滤器:
filter :role, label: "Roles", as: :select, collection: %w[ student teacher parent ]
Run Code Online (Sandbox Code Playgroud)
在较新版本的活动管理员中进行此类过滤的另一种方法:
# app/admin/my_model.rb
filter :my_custom_filter,
as: :numeric,
label: 'Custom Filter',
filters: [:eq]
Run Code Online (Sandbox Code Playgroud)
然后在模型文件中添加以下 2 个函数
您的过滤逻辑:
def self.my_custom_filter_eq(value)
where(column_1: value) # or probably a more complex query that uses the value inputted by the admin user
end
Run Code Online (Sandbox Code Playgroud)
为 Ransack 注册新过滤器
def self.ransackable_scopes(_auth_object = nil)
%i(my_custom_filter_eq)
end
Run Code Online (Sandbox Code Playgroud)
我找到了更好的方法.你只需要添加:
config.clear_sidebar_sections!
sidebar :filters do
render partial: 'search'
end
Run Code Online (Sandbox Code Playgroud)
然后_search使用构建器在部分内部创建表单ActiveAdmin::FormBuilder,如下所示:
https://github.com/gregbell/active_admin/blob/master/lib/active_admin/filters/forms.rb
有关如何操作的更多信息,请查看以下要点:
https://gist.github.com/4240801
另一个想法是创建类:
module ActiveAdmin
module Inputs
class FilterCustomStringInput < FilterStringInput
def input_name
"#{super}"
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
可以调用as: :custom_string,但我不喜欢这个想法,因为你很快就会发现,你需要创建custom_select等等......
2018 年回答。ActiveAdmin 使用 Ransack。
在模型本身上,您需要添加 Ransack 格式化程序:
ransacker :my_custom_filter, formatter: -> (category_id) {
ids = MyModel.where(category_id: category_id).pluck(:id) # return only id-s of returned items.
ids.present? ? ids : nil # return ids OR nil!
} do |parent| # not sure why this is needed .. but it is :)
parent.table[:id]
end
Run Code Online (Sandbox Code Playgroud)
在 ActiveAdmin 文件中,您需要指定规则:
filter :my_custom_filter_in, as: :select, collection: -> { Category.all } # sometimes my_custom_filter_eq - depending on what you want .. Specify different "as" when you need it.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
44880 次 |
| 最近记录: |