Fix empty string predicate filtering - allow empty strings in search conditions #1592
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problem
Empty string values in predicates were being ignored during search condition building, causing SQL conditions to be missing from generated queries. This behavior was inconsistent with the documented behavior that only
nil
values should be ignored.For example, the following search parameters:
Would generate SQL missing the empty string condition:
Instead of the expected:
Root Cause
The issue had two components:
Search parameter filtering: The
Search#initialize
method was filtering out parameters containing empty strings usingi.blank? && i != false
, which treats empty strings as "blank" and removes them.Predicate validation: The default predicate validator was rejecting empty strings with the logic
v.respond_to?(:empty?) ? !v.empty? : !v.nil?
.Solution
Modified Search Parameter Filtering
Updated the filtering logic in
lib/ransack/search.rb
to preserve strings while still filtering out truly empty values:Modified Predicate Validator
Updated the default validator in
lib/ransack/predicate.rb
to accept strings:Impact
eq
andin
predicates work with empty strings:name_eq: ""
andname_in: ["", "John"]
Testing
Added comprehensive tests covering:
eq
predicatesin
predicates with mixed valuesThe fix resolves the specific issue while maintaining backward compatibility for all other use cases.
Fixes #722
💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.