使用 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.

编码愉快 ;)