2017-05-20 8 views
1

私はpg_search gemを使って、アプリケーション内のテーブルに全文検索を追加しています。PostgreSQLで配列型のtsvector_update_triggerを使用するには?

変更後の日付までのTSV列を維持するためにトリガーを作成しようとしたときに私の問題は、これが私の移行です:

class AddStoreItemsIndex < ActiveRecord::Migration[5.0] 
    def up 
    add_column :store_items, :tsv, :tsvector 
    add_index :store_items, :tsv, using: "gin" 

    execute <<-SQL 
     CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE 
     ON store_items FOR EACH ROW EXECUTE PROCEDURE 
     tsvector_update_trigger(
     tsv, 'pg_catalog.english', title, full_description, recommended_age, related_intelligences 
    ); 
    SQL 
    end 

    ... 
end 

この場合、related_intelligences列は配列なので、ときこれを照会しようとしている私は、次のエラーを取得する:

ActiveRecord::StatementInvalid: 
     PG::DatatypeMismatch: ERROR: column "related_intelligences" is not of a character type 

は、どのように私はこのTSVベクトル列内の配列を含めることができますか?

答えて

3

これは、私はそれをやった方法です:

class AddStoreItemsIndex < ActiveRecord::Migration[5.0] 
    def up 
    add_column :store_items, :tsv, :tsvector 
    add_index :store_items, :tsv, using: 'gin' 

    execute <<-SQL 
     CREATE FUNCTION update_tsv() RETURNS trigger AS $$ 
     BEGIN 
     new.tsv := 
      to_tsvector('pg_catalog.english', coalesce(new.title,'')) || 
      to_tsvector('pg_catalog.english', coalesce(new.full_description,'')) || 
      to_tsvector('pg_catalog.english', coalesce(new.recommended_age,'')) || 
      to_tsvector('pg_catalog.english', coalesce(array_to_string(new.related_intelligences, ' '),'')); 
     return new; 
     END 
     $$ LANGUAGE plpgsql; 

     CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE 
     ON store_items FOR EACH ROW EXECUTE PROCEDURE update_tsv(); 
    SQL 
    end 

    def down 
    execute <<-SQL 
     DROP TRIGGER tsvectorupdate 
     ON store_items; 
     DROP FUNCTION update_tsv(); 
    SQL 

    remove_index :store_items, :tsv 
    remove_column :store_items, :tsv 
    end 
end 

tsvector_update_triggerは、配列の列に使用する代わりに、私はpostgresql search features pageからのコードサンプルに基づいてカスタム関数を作成することはできません。

私はarray_to_stringを使用して、配列要素をテキストに変換しました。

関連する問題