2017-10-30 9 views
0

「名前」と呼ばれるjson配列属性を持つProductテーブルがあります。たとえば、Product.first.name == ["large", "black", "hoodie"]。検索クエリに単語が含まれている商品のデータベースを検索したい。だから私は "大きなパーカー"を入力すると、Product.first結果に返す必要があります。検索キーに見つかった文字列を含む配列を検索するにはどうすればよいですか?

だから最初に私は、文字列の配列に検索キーを有効にする必要があります:

def search 
    search_array = params[:search].split(" ") 
    results = #??? 

が、どのように私もsearch_arrayに含まれる値を含む名前を持つ製品を検索することができますか?私はどのように配列内の値を検索するためのドキュメントを見つけましたが、配列自体を検索する方法については見つかりませんでした。

+0

はjsonbか、単にシリアル化されたテキスト列名ですか? –

答えて

2

単純に、@>(contains)演算子を使用できます。

select * from products; 
id | name |    tags    |   created_at   |   updated_at   
----+---------+--------------------------------+----------------------------+---------------------------- 
    3 | T-Shirt | {clothing,summer}    | 2017-10-30 05:28:19.394888 | 2017-10-30 05:28:19.394888 
    4 | Sweater | {clothing,winter,large,hoodie} | 2017-10-30 05:28:38.189589 | 2017-10-30 05:28:38.189589 
(2 rows) 


select * from products where tags @> '{large, hoodie}'; 
id | name |    tags    |   created_at   |   updated_at   
----+---------+--------------------------------+----------------------------+---------------------------- 
    4 | Sweater | {clothing,winter,large,hoodie} | 2017-10-30 05:28:38.189589 | 2017-10-30 05:28:38.189589 
(1 row) 

または、ARクエリとして、

2.3.1 :002 > Product.where("tags @> '{large, hoodie}'") 
    Product Load (0.4ms) SELECT "products".* FROM "products" WHERE (tags @> '{large, hoodie}') 
=> #<ActiveRecord::Relation [#<Product id: 4, name: "Sweater", tags: ["clothing", "winter", "large", "hoodie"], created_at: "2017-10-30 05:28:38", updated_at: "2017-10-30 05:28:38">]> 
+0

驚くばかり! LIKE/ILIKEメソッドがこれに統合できるかどうか知っていますか? –

+0

しかし、これらのスレッドを参照してください。 https://dba.stackexchange.com/questions/117740/postgresql-like-query-on-array-field https://stackoverflow.com/questions/7222106/postgres-query-of-an-array -using-like https://stackoverflow.com/questions/4928054/postgresql-wildcard-like-for-any-of-a-list-of-words – marmeladze

1

postgresqlを使用しているので、宝石pg_searchを使用できます。

は、モデル内の検索範囲を追加します。詳細については

include PgSearch 
pg_search_scope :search_on_text_columns, 
       against: %i(name), 
       using: { tsearch: { prefix: true } } 

documentationをチェックしてください。乾杯!

関連する問題