2012-03-10 4 views
2

もっと良い提案をしたいと思います...ルビー機能を使いやすくしてください。誰も私にこのクエリをアセンブルするためのより良いソリューションを与えることができますか? WHERE句で複数のオプションを使用したクエリを使用しているRuby

@conditions = "" 
if(ratings["G"] == "1") 
    @conditions += " 'G' " 

end 
if(ratings["PG"] == "1") 
    @conditions += " OR rating = 'PG' " 

end 
if(ratings["PG-13"] == "1") 
    @conditions += " OR rating = 'PG-13' " 

end 
if(ratings["R"] == "1") 
    @conditions += " OR rating = 'R' " 

end 

@movies = Movie.where("rating = "+ @conditions) 

return @movies 

答えて

5
Movie.where(:rating => ratings.select({|k,v| v == "1"}).keys) 
+0

可能であれば、.keysの使用を拡張してください。ありがとう! –

1

@xdazz答えがきれいである間は、この方法は、必要な出力を返します、どうもありがとうございます。

@conditions = "" 
ratings.each do |k, v| 
    @conditions << (@conditions.empty? ? "rating = '#{k}'" : " OR rating = '#{k}'") if v == "1" 
end 
@movies = Movie.where(@conditions) 

EDIT:

方法ハッシュ#キーは、単にハッシュのキーを返します。これは、次のように説明することができる。

p ratings.select { |k,v| v == "1" }.keys 
# => ["G", "PG", "PG-13", "R"] 
p ratings.select { |k,v| v == "1" } 
# => {"G"=>"1", "PG"=>"1", "PG-13"=>"1", "R"=>"1"} 

上記の方法は、文字列のようなより多くのSQLを返すだろうが:

最後に、@xdazz方法はachiveするためには、次のように書き換えることができ
p @conditions 
# => "rating = 'G' OR rating = 'PG' OR rating = 'PG-13' OR rating = 'R'" 

同じ出力:

p "rating = '" + ratings.select { |k,v| v == "1" }.keys.join("' OR rating = '") + "'" 
# => "rating = 'G' OR rating = 'PG' OR rating = 'PG-13' OR rating = 'R'" 

EDIT 2: 元の質問がされた場合についてだけで明確にしますRails、@xdazzの答えは、使用すべきものです。

+0

あなたが説明するのを助けることができます、これは完全なオブジェクトを取得する違いはzdazzだけのキーですか?もしxdazzが.keysを持っていなければ、それはどうでしょうか? –

+0

うーん、私は持っている!君たちありがとう ! – user1261175

関連する問題