2016-03-21 16 views
0

Userというモデルがあるとします。それには趣味があります。.whereで配列を使用してモデルを検索するにはどうすればよいですか?

user = User.first 
user.hobbies 
=> ["Bowling", "Cooking", "Knitting"] 

:hobbies属性を検索する場合はどうすればよいですか?私は、PostgreSQLを使用しています、と

:hobbies, :text, array:true 

User.whereは(趣味は: "私はここに入れたものは、文字列配列、ハッシュ")は、あなたがpostgres_extからcontainsまたはoverlapを試みるかもしれ

ActiveRecord::StatementInvalid: PG::InvalidTextRepresentation: ERROR: malformed array literal: 

答えて

1

User.where("hobbies @> ARRAY['Bowling', 'Cooking', 'Knitting']") 

または

User.where("hobbies && ARRAY['Bowling', 'Cooking', 'Knitting']") 

のPostgresた宝石し、クエリをインストールするだけで利用可能なarray operatorsの良いドキュメント。

+0

これらのどれかが 'どこの趣味( 'Bowling'、 'C​​ooking'、 'Knitting')'に翻訳されますか? 'Cosは最適なクエリです。 –

+0

'COUNT'は配列の長さを教えてくれませんが、集計クエリでロールアップする*行*の数を示します。それで、配列の長さにかかわらず、まだ1行しか残っていなくても、常にあなたに1を与えているのです。おそらく 'array_length(hobbies、1)'が必要です。しかし、私はあなたがしようとしていることを実際には分かっていないので、私は間違った道にいる可能性があります。 –

+1

ここで 'IN'を使うことができないのは、' hobbies'が文字列ではなく文字列の配列であるからです。ですから、代わりに配列演算子を使うべきです。 '@>は、'趣味 'には 'ボウリング'、 '料理'、 '編み物'があることを意味します。 '&&'は、少なくとも1つを持つことを意味します。 –

0

エラーをスローします宝石。例えば、あなたがwhereに文字列を渡すことで、あなたが望む任意のSQLを使用することができることを覚えておいてください

query = ["Bowling", "Cooking", "Knitting"] 

#With Overlap operator: 
User.where.overlap(hobbies: query) 

#or with Contains Operator 
User.where.contains(hobbies: query) 
+0

のための未定義メソッド 'overlap '。同じものが含まれています:l –

+0

ああ、私の悪い!これを動作させるには、 '' postgres_ext''(https://github.com/dockyard/postgres_ext)の宝石が必要です。 – Babar

関連する問題