searchable: add support for searching enum fields.
Allow searching enum fields by string, by id, or by array of comma-separated values. The category field in modactions is an example of an enum field that can be searched this way.
This commit is contained in:
@@ -149,7 +149,10 @@ module Searchable
|
|||||||
type = column.type || reflect_on_association(name)&.class_name
|
type = column.type || reflect_on_association(name)&.class_name
|
||||||
|
|
||||||
if column.try(:array?)
|
if column.try(:array?)
|
||||||
return search_array_attribute(name, type, params)
|
subtype = type
|
||||||
|
type = :array
|
||||||
|
elsif defined_enums.has_key?(name.to_s)
|
||||||
|
type = :enum
|
||||||
end
|
end
|
||||||
|
|
||||||
case type
|
case type
|
||||||
@@ -165,6 +168,10 @@ module Searchable
|
|||||||
numeric_attribute_matches(name, params[name])
|
numeric_attribute_matches(name, params[name])
|
||||||
when :inet
|
when :inet
|
||||||
search_inet_attribute(name, params)
|
search_inet_attribute(name, params)
|
||||||
|
when :enum
|
||||||
|
search_enum_attribute(name, params)
|
||||||
|
when :array
|
||||||
|
search_array_attribute(name, subtype, params)
|
||||||
else
|
else
|
||||||
raise NotImplementedError, "unhandled attribute type: #{name}"
|
raise NotImplementedError, "unhandled attribute type: #{name}"
|
||||||
end
|
end
|
||||||
@@ -232,6 +239,19 @@ module Searchable
|
|||||||
relation
|
relation
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def search_enum_attribute(name, params)
|
||||||
|
relation = all
|
||||||
|
|
||||||
|
if params[name].present?
|
||||||
|
value = params[name].split(/[, ]+/).map(&:downcase)
|
||||||
|
relation = relation.where(name => value)
|
||||||
|
elsif params["#{name}_id"].present?
|
||||||
|
relation = relation.numeric_attribute_matches(name, params["#{name}_id"])
|
||||||
|
end
|
||||||
|
|
||||||
|
relation
|
||||||
|
end
|
||||||
|
|
||||||
def search_array_attribute(name, type, params)
|
def search_array_attribute(name, type, params)
|
||||||
relation = all
|
relation = all
|
||||||
|
|
||||||
|
|||||||
@@ -2,19 +2,33 @@ require 'test_helper'
|
|||||||
|
|
||||||
class ModActionsControllerTest < ActionDispatch::IntegrationTest
|
class ModActionsControllerTest < ActionDispatch::IntegrationTest
|
||||||
context "The mod actions controller" do
|
context "The mod actions controller" do
|
||||||
setup do
|
|
||||||
@mod_action = create(:mod_action)
|
|
||||||
end
|
|
||||||
|
|
||||||
context "index action" do
|
context "index action" do
|
||||||
|
setup do
|
||||||
|
@ban = create(:mod_action, category: :post_ban)
|
||||||
|
@unban = create(:mod_action, category: :post_unban)
|
||||||
|
end
|
||||||
|
|
||||||
should "work" do
|
should "work" do
|
||||||
get mod_actions_path
|
get mod_actions_path
|
||||||
assert_response :success
|
assert_response :success
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "category enum searches" do
|
||||||
|
should respond_to_search(category: "post_ban").with { [@ban] }
|
||||||
|
should respond_to_search(category: "post_unban").with { [@unban] }
|
||||||
|
should respond_to_search(category: "Post_ban").with { [@ban] }
|
||||||
|
should respond_to_search(category: "post_ban post_unban").with { [@unban, @ban] }
|
||||||
|
should respond_to_search(category: "post_ban,post_unban").with { [@unban, @ban] }
|
||||||
|
should respond_to_search(category: "44").with { [@ban] }
|
||||||
|
should respond_to_search(category_id: "44").with { [@ban] }
|
||||||
|
should respond_to_search(category_id: "44,45").with { [@unban, @ban] }
|
||||||
|
should respond_to_search(category_id: ">=44").with { [@unban, @ban] }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "show action" do
|
context "show action" do
|
||||||
should "work" do
|
should "work" do
|
||||||
|
@mod_action = create(:mod_action)
|
||||||
get mod_action_path(@mod_action)
|
get mod_action_path(@mod_action)
|
||||||
assert_redirected_to mod_actions_path(search: { id: @mod_action.id })
|
assert_redirected_to mod_actions_path(search: { id: @mod_action.id })
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user