2012-03-10 2 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) 

편집 :

방법 해시 # 키는 단순히 해시의 키를 돌려줍니다. 이것은으로 설명 될 수있는 다음과 같은 : 실현하려 위해,

마지막으로
p @conditions 
# => "rating = 'G' OR rating = 'PG' OR rating = 'PG-13' OR rating = 'R'" 

, @xdazz 방법은 다음에 다시 할 수 있습니다

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을 반환하는 동안 같은 출력 :

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

편집 2 : 원래의 질문에 대한 경우 그냥 명확하게하기 Rails, @xdazz 대답은 사용해야합니다.

+0

제발 설명해 주시겠습니까? 차이점은 이것이 zdazz 만 키가있는 동안 전체 객체를 가져옵니다. xdazz에 .keys가 없다면 어떻게 될까요? –

+0

흠, 잡았다! 고마워요! – user1261175

관련 문제