Jak wykonać wyszukiwanie w bazie danych, jeśli wyszukiwanie może zawierać wiele opcjonalnych parametrów, takich jak identyfikator, kod pocztowy, miasto i stan? Mogą one mieć wartości lub być całkowicie puste. Jak utworzyć takie zapytanie o szynę?Wyszukiwanie po szynach z opcjonalnymi parametrami?
Odpowiedz
można zbudować zapytanie:
conditions = {}
conditions[:city] = city unless city.blank?
conditions[:zip] = zip unless zip.blank?
conditions[:state] = state unless state.blank?
Address.find(:all, :conditions => conditions)
Zazwyczaj rada jest, aby przejść do modelu logiki i utrzymywać regulator chude jak to możliwe. Istnieją różne podejścia do sposobu filtra, pierwsza:
class Record < ActiveRecord::Base
def self.filter(attributes)
attributes.select { |k, v| v.present? }.reduce(all) do |scope, (key, value)|
case key.to_sym
when :id, :zip # direct search
scope.where(key => value)
when :city, :state # regexp search
scope.where(["#{key} ILIKE ?", "%#{value}%"])
when :order # order=field-(ASC|DESC)
attribute, order = value.split("-")
scope.order("#{self.table_name}.#{attribute} #{order}")
else # unknown key (do nothing or raise error, as you prefer to)
scope
end
end
end
end
Drugie podejście, pisać gołe filter
że tylko wykorzystuje istniejące zakresów:
class Record < ActiveRecord::Base
SUPPORTED_FILTERS = [:id, :city, ...]
scope :id, ->(value) { where(id: value) }
scope :city, ->(value) { where(city: "%#{value}%") }
...
def self.filter(attributes)
attributes.slice(*SUPPORTED_FILTERS).reduce(all) do |scope, (key, value)|
value.present? ? scope.send(key, value) : scope
end
end
end
dla szyn 5, który teraz używa ActionController: : Parametry, składnia dla metody filtra jest:
def self.filter(attributes)
attributes.permit(SUPPORTED_FILTERS).to_hash.reduce(all) do |scope, (key, value)|
value.present? ? scope.send(key, value) : scope
end
end
modele mogą być wywoływane z dowolnego miejsca w aplikacji, dzięki czemu są one wielokrotnego użytku i łatwiejsze do testowania. Teraz kontroler wygląda tak prosto, jak:
class RecordsController < ApplicationController::Base
respond_to :html, :xml
def index
@records = Record.filter(params)
end
end
+1 dobry sposób na utrzymanie prostego sterownika – zetetic
@tokland Użyłem twojego rozwiązania. Wygląda bardziej elegancko niż http://railscasts.com/episodes/112-anonymous-scopes i http://railscasts.com/episodes/111-advanced-search-form. Wielkie dzięki! –
Czy to rozwiązanie nie ma potencjalnej luki w zabezpieczeniach polegającej na wycieku pamięci/ataku DoS? Ex, ktoś ciągle wysyła duże ciągi zapytań, a model zachowuje kluczowe ciągi zapytań do key.to_sym'ing? –
http://metautonomo.us/projects/metasearch/ jest tym, czego potrzebujesz.
= text_field_tag 'search[city_like]', ''
= text_field_tag 'search[zip_equals]', ''
= text_field_tag 'search[state_equals]', ''
A potem po prostu
Record.search(params[:search])
- 1. Activator.CreateInstance z opcjonalnymi parametrami
- 2. Entity Framework z opcjonalnymi parametrami?
- 3. Mniej css z opcjonalnymi parametrami
- 4. Metoda Groovy z opcjonalnymi parametrami
- 5. Zapisana procedura z opcjonalnymi parametrami "WHERE"
- 6. Konstruktor Angular 2 DI z opcjonalnymi parametrami
- 7. rozdzielczości Sposób metod rozszerzenie z opcjonalnymi parametrami
- 8. Tworzenie skryptu bash z opcjonalnymi parametrami dla flagi
- 9. Kontener biblioteki standardowej z dodatkowymi opcjonalnymi parametrami szablonu?
- 10. User Sub z parametrami opcjonalnymi - niewidoczne w oknie Macro
- 11. Python konstruktor robi dziwne rzeczy z opcjonalnymi parametrami
- 12. Wywoływanie metod z opcjonalnymi parametrami za pomocą refleksji
- 13. Trasa z dwoma opcjonalnymi parametrami w MVC3 nie działa
- 14. Konstrukcja klasy PHP z trzema opcjonalnymi parametrami, ale jedna wymagana?
- 15. Jak wypełnić kwerendę sql wieloma opcjonalnymi parametrami w PreparedStatement?
- 16. defrecord z opcjonalnymi kluczami
- 17. String.Format() z opcjonalnymi zastępcze
- 18. C# Interfejsy z opcjonalnymi metodami
- 19. regex: string z opcjonalnymi częściami
- 20. Dlaczego klasyczne ograniczenie new() nie jest spełnione przez klasę z opcjonalnymi parametrami w konstruktorze?
- 21. Linq z opcjonalnymi opcjami WHERE
- 22. TimeSpan FormatString z opcjonalnymi godzinami
- 23. Przekierowanie django() z parametrami
- 24. ASP.NET MVC: RedirectToAction z parametrami do działania po
- 25. C# web-api po funkcjonować z dwoma parametrami
- 26. Wycofanie transakcji po zatwierdzeniu w szynach
- 27. Generowanie avro schematu z opcjonalnymi wartościami
- 28. Wiązanie JSON-LD z opcjonalnymi właściwościami?
- 29. Parametry z opcjonalnymi zamknięciami w Swift
- 30. Jak utworzyć funkcję Python z opcjonalnymi argumentami?
Czy możesz mi powiedzieć, czy trzeba uruchomić ten sam typ kwerendy w mongoid ale z większą niż stanie w jednym parametrem, jaki sposób mogę to zrobić ? Nadzieję, że rozumiecie! –