ActiveRecord: Заявка за множество параметри, включително търсене, ако има

Имам формуляр, където имам три полета за въвеждане, които потребителят може - добре - да използва. Две са падащи менюта, едно за дата и т.н. друго за тагове. Последният е вход за търсене, който е свързан с elasticsearch в бекенда.

Сега имам въпроса да намеря подходяща клауза where, която да възпрепятства всички обстоятелства, т.е. всички възможни комбинации. Бих могъл да направя нещо като в този отговор, но в моя случай предполагам, че това ще доведе до объркан код, поради което Търся по-елегантен начин. Етикети и видеоклипове имат has_and_belongs_to_many-associations.

Ето какво имам досега:

if params[:sort].blank? || params[:sort].nil?
  params[:sort] = sort_column + ' ' + sort_direction   
else
  if params[:sort] == "date"
    params[:sort] = "created_at"
  elsif ...
  end     
end

if params[:tag].blank? || params[:tag].nil?
  params[:tag] = "*"
end

if params[:q].blank? || params[:q].nil?
  params[:q] = "*"
end

И моето запитване

@models = @Model.joins(:tags).where(tags: {name: params[:tag]}, videos: {event_id: params[:event_id]}).order(params[:sort]).page(params[:page]).search(params[:q]).records

Какво би било най-елегантното решение? Горното не става. За url, където е избран само етикетът, той ще върне всички елементи.


person stiller_leser    schedule 26.06.2014    source източник
comment
Разглеждали ли сте скъпоценен камък, наречен ransack, той често се използва за подобни ситуации.   -  person Eyeslandic    schedule 26.06.2014
comment
Няма нужда да използвате и двете .blank? и .нула?. .празно? покрива и нулеви стойности. api.rubyonrails.org/classes/Object.html#method- i-празно-3F   -  person Nitish Parkar    schedule 26.06.2014
comment
Gem has_scope ще работи добре за това.   -  person infused    schedule 26.06.2014
comment
Благодаря за всички ваши предложения. Всъщност написах направени всички възможни комбинации. Оказа се, че съм ги надценил. В крайна сметка получих около десет случая, което предполагам е добре.   -  person stiller_leser    schedule 27.06.2014