Rails Admin下拉框params[:query]被忽略,关联筛选失效求助
我之前在结合Globalize使用Rails Admin时,也碰到过一模一样的belongs_to关联筛选失效问题——明明参数传过去了,但就是不生效,日志里能看到query参数,但就是没被解析到关联模型的搜索里。折腾了好一阵,终于找到几个可行的解决办法,分享给你:
1. 直接在Rails Admin配置里自定义关联字段的搜索逻辑
如果你的关联模型用了Globalize做国际化,默认的searchable选项不会自动关联翻译表,所以得手动指定关联路径和字段。比如假设你的主模型是Product,belongs_to关联Category,而Category用Globalize存了name字段在category_translations表里:
# app/admin/product.rb RailsAdmin.config do |config| config.model Product do # 列表页的搜索配置 list do field :category do # 指定搜索关联模型的翻译字段 searchable [{ category: :translations }, :name] queryable true # 强制开启该字段的可查询性 end end # 筛选面板的配置(如果需要在侧边筛选里用) filters do filter :category, type: :string do # 自定义SQL查询,关联翻译表并匹配当前locale的字段 query do bindings[:object] .joins(category: :translations) .where("category_translations.name LIKE ? AND category_translations.locale = ?", "%#{bindings[:value]}%", I18n.locale) end end end end end
2. 用Ransacker自定义搜索字段(更灵活)
Rails Admin底层依赖Ransack做搜索,所以可以在模型里定义一个自定义的ransacker,直接关联到关联模型的翻译字段,这样Rails Admin就能正确解析参数了:
# app/models/product.rb class Product < ApplicationRecord belongs_to :category # 自定义ransacker,用于搜索分类的名称(支持Globalize) ransacker :category_name do # 这里要注意表名和关联关系的正确性,根据你的实际模型调整 Arel.sql("(SELECT name FROM category_translations WHERE category_translations.category_id = products.category_id AND category_translations.locale = '#{I18n.locale}')") end end
然后在Rails Admin里直接用这个自定义的搜索字段:
# app/admin/product.rb RailsAdmin.config do |config| config.model Product do list do field :category do searchable :category_name # 关联到自定义的ransacker end end filters do # 在筛选面板添加这个自定义字段,方便用户筛选 filter :category_name, type: :string, label: "Category Name" end end end
3. 检查Locale配置
有时候问题出在Globalize的locale没有和Rails Admin同步,导致搜索时查错了翻译表的locale。可以在Rails Admin的初始化文件里设置默认locale:
# config/initializers/rails_admin.rb RailsAdmin.config do |config| config.default_locale = I18n.locale end
另外,如果你需要支持多语言切换,也可以在ransacker里动态获取当前locale,而不是硬编码。
最后排查参数映射
看Puma日志里的参数,如果是类似query: { category_name_cont: "xxx" },那上面的ransacker就能正确匹配;如果参数键不对,可能需要调整Rails Admin里的searchable配置,确保和ransacker的名称对应上。
试完这些方法,应该就能解决嵌套关联+Globalize下的搜索筛选问题了。
内容的提问来源于stack exchange,提问作者zhisme

