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