У меня есть модели Company Customer и CompanyCustomerField.Клиенты хранят значения hstore в столбце «свойства» - ключи находятся в поле CompanyCustomerField # name.Когда создается новый CompanyCustomerField, мне нужно добавить #name в ransack, чтобы сделать их доступными для поиска.
Когда добавляется новый CompanyCustomerField и я перехожу в форму поиска, я получаю
undefined method `*_cont' for #<Ransack::Search:0x00007ff670100978>
потому что новое поле недоступно для поиска.Если я выключаю сервер, на котором происходит сбой, и перезагружаю его, он работает, потому что он получает его в ранчо.Я не знаю, как динамически добавлять функциональность в Ransack.Любые идеи с благодарностью.
Customer.rb.это помещает все доступные для поиска поля в Ransack, но не обновляет его, когда добавляются новые.потому что это вызывается только один раз.
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 %>
....
Даже при перемещении перезагрузки на контроллер, все тот жерезультат.
CustomersController.rb
def index
Customer.reload_ransacker
@search = current_company.customers.includes(:owner).ransack(params[:q])
@customers = @search.result.page(params[:page])
end
Customer.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>):