Руби с использованием запросов с несколькими параметрами в предложении WHERE - PullRequest
2 голосов
/ 10 марта 2012

Я хотел бы получить лучшее предложение ... чтобы лучше использовать функции рубина.Может кто-нибудь дать мне лучшее решение для сборки этого запроса?

@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

Большое вам спасибо,

Ответы [ 2 ]

5 голосов
/ 10 марта 2012
Movie.where(:rating => ratings.select({|k,v| v == "1"}).keys)
1 голос
/ 10 марта 2012

, пока ответ @xdazz более чистый, этот способ возвращает требуемый результат.

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

EDIT:

Метод Hash # keys просто возвращает ключи хеша. Это может быть проиллюстрировано следующим:

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 @conditions 
# => "rating = 'G' OR rating = 'PG' OR rating = 'PG-13' OR rating = 'R'"

Наконец, метод @xdazz может быть переписан для получения того же результата:

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.

...