diff --git a/lib/pg_search/configuration/column.rb b/lib/pg_search/configuration/column.rb index 4c4cf99e..f3c95203 100644 --- a/lib/pg_search/configuration/column.rb +++ b/lib/pg_search/configuration/column.rb @@ -18,7 +18,16 @@ def full_name end def to_sql - "coalesce(#{expression}::text, '')" + coalesce("#{expression}::text") + end + + def to_sql_no_cast + coalesce(expression) + end + + def tsvector? + psql_column = @model.columns_hash[name] + psql_column && psql_column.type.eql?(:tsvector) end private @@ -34,6 +43,10 @@ def column_name def expression full_name end + + def coalesce(value) + "coalesce(#{value}, '')" + end end end end diff --git a/lib/pg_search/features/tsearch.rb b/lib/pg_search/features/tsearch.rb index ddec16bf..a1235984 100644 --- a/lib/pg_search/features/tsearch.rb +++ b/lib/pg_search/features/tsearch.rb @@ -122,16 +122,20 @@ def columns_to_use end def column_to_tsvector(search_column) - tsvector = Arel::Nodes::NamedFunction.new( - "to_tsvector", - [dictionary, Arel.sql(normalize(search_column.to_sql))] - ).to_sql - - if search_column.weight.nil? - tsvector + if search_column.tsvector? + tsvector = Arel.sql(normalize(search_column.to_sql_no_cast)) else - "setweight(#{tsvector}, #{connection.quote(search_column.weight)})" + tsvector = Arel::Nodes::NamedFunction.new( + "to_tsvector", + [dictionary, Arel.sql(normalize(search_column.to_sql))] + ).to_sql end + + if search_column.weight + tsvector = "setweight(#{tsvector}, #{connection.quote(search_column.weight)})" + end + + tsvector end end end