我想在页面上为与用户模型关联的模型创建一个 activeadmin 过滤器。我想使用自定义范围
matches_name
,它结合了 first_name
和 last_name
字段。我已将该范围添加到模型的 ransackable_scopes
方法中,并且我可以在 Rails 控制台中查询它。
我已经像这样指定了过滤器:
filter :user_matches_name, as: :string, label: "User"
但是,当我加载页面时,它会出错并显示以下消息:
undefined method `user_matches_name_contains' for Ransack::Search<class: MyModel, base: Grouping <combinator: and>>:Ransack::Search
我已经能够在用户 activeadmin 页面上创建过滤器,而不会出现类似的错误:
filter :matches_name, as: :string, label: "User"
有没有办法防止 ransack 或 activeadmin 在过滤器末尾附加额外的
_contains
?
您可以使用 ransacker 组合 User 类的名字和姓氏(例如全名),然后从与用户模型关联的 ActiveAdmin 资源文件中使用此过滤器:
filter :user_full_name, as: :string, label: 'User'
注册我的模型资源
ActiveAdmin.register MyModel do
actions :index
filter :user_full_name, as: :string, label: 'User'
end
用户资源注册
ActiveAdmin.register User do
actions :index
end
User 和 MyModel 模型
class MyModel < ApplicationRecord
belongs_to :user
def self.ransackable_associations(auth_object = nil)
%w[user]
end
def self.ransackable_attributes(auth_object = nil)
%w[created_at id id_value updated_at user_id]
end
end
class User < ApplicationRecord
ransacker :full_name do |parent|
Arel::Nodes::InfixOperation.new('||', parent.table[:first_name], parent.table[:last_name])
end
def self.ransackable_attributes(auth_object = nil)
%w[created_at first_name full_name id id_value last_name updated_at]
end
end
此代码应该可以与 3.x.x 和 2.x.x 版本的 ActiveAdmin gem 一起正常工作