Имам формуляр, където имам три полета за въвеждане, които потребителят може - добре - да използва. Две са падащи менюта, едно за дата и т.н. друго за тагове. Последният е вход за търсене, който е свързан с 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, където е избран само етикетът, той ще върне всички елементи.
ransack
, той често се използва за подобни ситуации. - person Eyeslandic   schedule 26.06.2014