2016-03-20 14 views
0

myテーブルの1列はjson形式の文字列で構成されています。私はActiveRecordを使用して、配列に含まれる同じ項目に一致するか、または同じ項目で構成される配列を持つすべてのレコードを返す方法を知りたいと思います。例えばActiveRecordを使用してレコードの配列に一致させる

:SQL部分にはActiveRecordでシリアライズされたデータを検索

flag.colors = ['red', 'blue', 'green'] 
query = ['blue', 'red', 'green'] 

Flag.where('colors matches query') #=> flag 
+0

どのデータベースですか? "json形式の文字列の配列"とは、 'varchar'または' text'カラムのJSONを意味しますか、データベースのネイティブJSONサポートを使用していますか? –

+0

私はPostgreSQLを使用していますが、ネイティブなJSONサポート(バグあり)は使用していません。データ型はStringですが、JSON.parseメソッドを使用してRubyの配列に持ち込みます。理想的ではない、私は今実現している... – exchez

+0

あなたのJSONは文字列の配列なので、 'text []'カラムを使うようにスキーマを修正できますか?配列の列はActiveRecordで正常に動作するはずです。 –

答えて

2

はできません。あなたはRubyの端でフィルタリングすることができます:

flag.colors = ['red', 'blue', 'green'] 
query = ['blue', 'red', 'green'] 

Flag.all.select{|f| f.colors.sort == query.sort} #=> [flag] 

あなたはPostgreSQLを使用しているので、実際には良い方法があります。 PGはネイティブ配列をサポートします。あなたは、マイグレーションでそれを有効にすることができます。

create_table :flags do |t| 
    t.text :tags, array: true 
end 

その後、単にそれを検索:

query = ['blue', 'red', 'green'] 

#With Overlap operator: 
Flag.where.overlap(tags: query) 

#or with Contains Operator 
Flag.where.contains(tags: query) 

あなたは詳細hereを見つけることができます。

+0

ありがとう、これは多くの助けになりました! – exchez

関連する問題