使用 ransack 查找数组属性包含特定字符串的对象
Use ransack to find objects whose array attribute contain a specific string
模型 A 具有属性 "languages",这是一个包含 "English"、"French" 等元素的数组。
我的站点有一个表单,允许用户 select 一种语言,它将显示 "languages" 包含该语言的所有对象。
如何设计我的控制器和视图?从文档中,有一些方法可以检查元素是否在查询数组中,而不是相反。
我刚刚在another question上回答了这个问题,我也会在这里添加答案以备将来参考。
正如在 this issue you need to add the gem postgres_ext 上讨论到您的项目:
# Gemfile
gem 'postgres_ext'
并将其添加到初始化程序中:
# config/initializers/ransack.rb
Ransack.configure do |config|
%w[
contained_within
contained_within_or_equals
contains
contains_or_equals
overlap
].each do |p|
config.add_predicate p, arel_predicate: p, wants_array: true
end
end
之后,您将能够在序列化数组中使用 contains
。
另一种方法,可能更容易使用范围,例如:
首先,在模型中定义一个范围:
scope_languages_include, -> (*languages) {where("languages && '{#{languages.to_s.delete("[]")}}'")}
用 *
定义参数很重要
其次在同一个模型中,您需要定义一个允许搜索使用范围的私有方法。
def self.ransackable_scopes(auth_object = nil)
%w(lenguages_include)
end
在最后一步定义 search_form_for:
<%= search_form_for @q, url: some_path do |f| %>
<% LANGUAGE::ALL.each do |lang| %>
<%= check_box_tag 'q[scope_languages_include][]', lang %>
<%= lang %>
<% end %>
<% end %>
此代码在Rails5.
编码愉快 ;)
模型 A 具有属性 "languages",这是一个包含 "English"、"French" 等元素的数组。 我的站点有一个表单,允许用户 select 一种语言,它将显示 "languages" 包含该语言的所有对象。
如何设计我的控制器和视图?从文档中,有一些方法可以检查元素是否在查询数组中,而不是相反。
我刚刚在another question上回答了这个问题,我也会在这里添加答案以备将来参考。
正如在 this issue you need to add the gem postgres_ext 上讨论到您的项目:
# Gemfile
gem 'postgres_ext'
并将其添加到初始化程序中:
# config/initializers/ransack.rb
Ransack.configure do |config|
%w[
contained_within
contained_within_or_equals
contains
contains_or_equals
overlap
].each do |p|
config.add_predicate p, arel_predicate: p, wants_array: true
end
end
之后,您将能够在序列化数组中使用 contains
。
另一种方法,可能更容易使用范围,例如:
首先,在模型中定义一个范围:
scope_languages_include, -> (*languages) {where("languages && '{#{languages.to_s.delete("[]")}}'")}
用 *
定义参数很重要其次在同一个模型中,您需要定义一个允许搜索使用范围的私有方法。
def self.ransackable_scopes(auth_object = nil)
%w(lenguages_include)
end
在最后一步定义 search_form_for:
<%= search_form_for @q, url: some_path do |f| %>
<% LANGUAGE::ALL.each do |lang| %>
<%= check_box_tag 'q[scope_languages_include][]', lang %>
<%= lang %>
<% end %>
<% end %>
此代码在Rails5.
编码愉快 ;)