lib/metka/query_builder/base_query.rb in metka-2.1.0 vs lib/metka/query_builder/base_query.rb in metka-2.2.0
- old
+ new
@@ -5,24 +5,44 @@
module Metka
class BaseQuery
include Singleton
def call(model, column_name, tag_list)
- column_cast = Arel::Nodes::NamedFunction.new(
- 'CAST',
- [model.arel_table[column_name].as('text[]')]
- )
+ tags = tag_list.to_a
- value = Arel::Nodes::SqlLiteral.new(
- # In Rails 5.2 and above Sanitanization moved to public level, but still we have to support 4.2 and 5.0 and 5.1
- ActiveRecord::Base.send(:sanitize_sql_for_conditions, ['ARRAY[?]', tag_list.to_a])
- )
+ if tags.one?
+ value = Arel::Nodes::SqlLiteral.new(
+ ActiveRecord::Base.sanitize_sql_for_conditions(['?', tags.first])
+ )
- value_cast = Arel::Nodes::NamedFunction.new(
- 'CAST',
- [value.as('text[]')]
- )
+ column_cast = Arel::Nodes::NamedFunction.new(
+ 'ANY',
+ [model.arel_table[column_name]]
+ )
- Arel::Nodes::InfixOperation.new(infix_operator, column_cast, value_cast)
+ Arel::Nodes::Equality.new(value, column_cast)
+ else
+ value = Arel::Nodes::SqlLiteral.new(
+ ActiveRecord::Base.sanitize_sql_for_conditions(['ARRAY[?]::varchar[]', tags])
+ )
+
+ Arel::Nodes::InfixOperation.new(infix_operator, model.arel_table[column_name], value)
+ end
+ # column_cast = Arel::Nodes::NamedFunction.new(
+ # 'CAST',
+ # [model.arel_table[column_name].as('text[]')]
+ # )
+
+ # value = Arel::Nodes::SqlLiteral.new(
+ # ActiveRecord::Base.sanitize_sql_for_conditions(['ARRAY[?]::varchar[]', tag_list.to_a])
+ # )
+
+ # value_cast = Arel::Nodes::NamedFunction.new(
+ # 'CAST',
+ # [value.as('text[]')]
+ # )
+
+ # # Arel::Nodes::InfixOperation.new(infix_operator, column_cast, value_cast)
+ # Arel::Nodes::InfixOperation.new(infix_operator, model.arel_table[column_name], value)
end
end
end