ruby-on-rails - 在 Ransack 中,当模型更新时动态更新 ranackers
问题描述
我有 Company Customer 和 CompanyCustomerField 模型。客户将 hstore 值存储在“属性”列中 - 键来自 CompanyCustomerField#name 字段。创建新的 CompanyCustomerField 时,我需要将#name 添加到 ransack 以使其可搜索。
当添加了新的 CompanyCustomerField 并转到我得到的搜索表单时
undefined method `*_cont' for #<Ransack::Search:0x00007ff670100978>
因为新字段不可用于搜索。如果我关闭失败的服务器并重新启动它,它会工作,因为它会进入洗劫状态。我不知道如何将功能动态添加到 ransack 中。任何想法都非常感谢。
客户.rb。这会将所有可搜索字段放入洗劫,但在添加新字段时不会更新它。因为这只被调用一次。
class Customer < ApplicationRecord
# ['favorite_color', 'receive_email_marketing' etc etc]
CompanyCustomerField.pluck(:name).each do |name|
ransacker name.to_sym do |parent|
Arel::Nodes::InfixOperation.new('->', parent.table[:properties], Arel::Nodes.build_quoted(name))
end
end
end
这是搜索表格:
#customers/index.html
<%= search_form_for @search, remote: true do |f| %>
<% current_company.customer_fields.each do |field| %>
<%= render "customers/search_fields/#{field.field_type}", f: f, field: field %>
<% end %>
<% end %>
#customers/search_fields/text_field
<%= f.label (field.name + "_cont").to_sym, field.name.humanize %>
<%= f.text_field (field.name + "_cont").to_sym %>
....
即使将重新加载移动到控制器,结果仍然相同。
客户控制器.rb
def index
Customer.reload_ransacker
@search = current_company.customers.includes(:owner).ransack(params[:q])
@customers = @search.result.page(params[:page])
end
客户.rb
def self.reload_ransacker
puts "==="
puts "reload ransacker"
puts "==="
CompanyCustomerField.pluck(:name).each do |name|
ransacker name.to_sym do |parent|
Arel::Nodes::InfixOperation.new('->', parent.table[:properties], Arel::Nodes.build_quoted(name))
end
end
end
ActionView::Template::Error (undefined method `foo_cont' for #<Ransack::Search:0x00007fba3c05d5b8>):
解决方案
解决方案:
需要覆盖:
module Ransack
module Adapters
module ActiveRecord
module Base
def ransacker(name, opts = {}, &block)
@ransackable_attributes = nil
self._ransackers = _ransackers.merge name.to_s => Ransacker
.new(self, name, opts, &block)
end
end
end
end
end
@ransackable_attributes
需要重置为 nil 所以在def ransackable_attributes(auth_object = nil)
实例中 var 是 nil 并且可以重新加载
应该被认为是洗劫中的一个错误。
推荐阅读
- sharepoint - 用于在 SharePoint PnP 搜索中获取用户名的用户句柄表达式
- node.js - Redis 在 docker 中未定义
- javascript - 我们如何在另一个组件中创建抽屉导航并在 app.js 中调用它
- python - Google Foobar Challenge(Python) - 幸运羊问题
- gwt - 在 GWT 中继承自定义 jar 文件不起作用
- r - 绘制大型邻接矩阵(不是图)的最有效方法是什么?
- python - 在Python中查找所有满足子字典参数的字典
- java - toString() 方法,String.format() 方法。如何调整字符串线
- python - 如何导航到主页?- 蟒蛇django
- java - 通过 ADB 导入 .VCF 文件