2016-07-25 9 views
0

私はハッシュの配列を持っています。ハッシュの配列からのActiveRecordクエリ

eg) array_of_hash = [ { id: 20, name: 'John' }, { id: 30, name: 'Doe'} ] 

特定のハッシュのすべての条件に一致するレコードを取得したいとします。 だから私は実行を取得するクエリは、ハッシュの配列からこのクエリを構築するための最良の方法は何

SELECT persons.* FROM persons WHERE persons.id = 20 AND persons.name = 'John' OR persons.id = 30 AND persons.name = 'Doe' 

のですか?

答えて

1

私はこれは大丈夫だと思う:

ids = array_of_hash.map { |h| h[:id] } 
names = array_of_hash.map { |h| h[:name] } 

Person.where(id: ids, name: names) 

(それはスーパージェネリックではないのですが)他の 試み:

people = Person.all 
array_of_hash.each do |h| 
    people = people.where(h) 
end 
people # => will generate a long long query. 
+0

排除方法 \t '{id:20、name: 'Doe'}'? –

+0

私はOPが((id1とname1)か(id2とname2))のようなものを望んでいると思いますか? –

+0

これは、id - 20と 'Doe'という名前のレコードを返す可能性があります。特定のハッシュのすべての条件に一致するレコードが必要です。 –

0

独立して、あなたのActiveRecordのモデルにすべての条件をマッピングし、その後結果の配列を平らにしてください:

array_of_hash.map{ |where_clause| Person.where(where_clause) }.flatten 
+0

どのように 'ActiveRecord :: Relation'sの配列を平坦化しますか – siegy22

+0

これは、単一のwhere句ごとにクエリを実行しませんか?私は、すべてのレコードを単一のクエリで読み込むことができれば好きです。 –

+0

@RaVeNここで確認できます。 'ActiveRecord :: Relation'は自動的に通常の配列になります。私はdownvoteがここで適切だとは思わない。 –

関連する問題