Arama, ID, Zip, Şehir ve Eyalet gibi birçok isteğe bağlı parametre sunabiliyorsa, bir veritabanında nasıl arama yaparım? Bunlar değerlere sahip olabilir veya tamamen boş olabilir. Böyle bir raylı sorguyu nasıl yapardım?Raylar İsteğe bağlı parametreler ile arayın?
cevap
Bir sorgu birikebilir:
conditions = {}
conditions[:city] = city unless city.blank?
conditions[:zip] = zip unless zip.blank?
conditions[:state] = state unless state.blank?
Address.find(:all, :conditions => conditions)
olağan danışma modeline mantığı taşımak ve mümkün olduğunca yalın kontrolörü tutmaktır. filtre yöntemi için farklı yaklaşımlar, ilk vardır: şu anda ActionController kullanır Raylar 5 için
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
:
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
ikinci bir yaklaşım, sadece mevcut kapsamları kullanan bir çıplak filter
geç: : Parametreler, filtre yöntemi için sözdizimi şöyledir:
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
Modelleri yerde uygulamanızda çağrılabilir, böylece yeniden kullanılabilir ve test etmek daha kolaydır edilebilir.
class RecordsController < ApplicationController::Base
respond_to :html, :xml
def index
@records = Record.filter(params)
end
end
+1 denetleyiciyi basit tutmanın iyi bir yolu – zetetic
@tokland Çözümünüzü kullandım. Http://railscasts.com/episodes/112-anonymous-scopes ve http://railscasts.com/episodes/111-advanced-search-form adresinden daha zarif görünüyor. Çok teşekkürler! –
Bu çözümde potansiyel bir bellek sızıntısı/DoS saldırısı güvenlik açığı yok mu? Ex, birisi büyük sorgu dizeleri göndermeye devam ediyor ve model rastgele sorgu dizeleri key.to_sym'ing tutar? –
http://metautonomo.us/projects/metasearch/ ne ihtiyaç vardır: gibi şimdi kontrolör gibi basit görünüyor. Sonra
= text_field_tag 'search[city_like]', ''
= text_field_tag 'search[zip_equals]', ''
= text_field_tag 'search[state_equals]', ''
Ve sadece
Record.search(params[:search])
- 1. Raylar, isteğe bağlı parametreler
- 2. isteğe bağlı parametreler proc?
- 3. Linq isteğe bağlı parametreler
- 4. C# bu parametreler isteğe bağlı
- 5. Powershell olmayan pozisyonel, isteğe bağlı parametreler
- 6. Yöntem Geçersiz Kılma ve İsteğe Bağlı Parametreler
- 7. Raylar isteğe bağlı /: yerel rota
- 8. Enterprise Architect: C# İsteğe bağlı parametreler?
- 9. wsdl modundaki PHP SoapClient sınıfı ile isteğe bağlı parametreler
- 10. İsteğe Bağlı Parametreler C# - Kullanıcı tanımlı Sınıfın sıfırlanması
- 11. initializer_list ile isteğe bağlı yapıcı
- 12. Dart'ta adlandırılmış ve isteğe bağlı parametreler arasındaki fark nedir?
- 13. VB işlevinde isteğe bağlı parametreler/varsayılan değer parametreleri nasıl eklenir?
- 14. isteğe bağlı normal regex lookahead
- 15. Hızlı isteğe bağlı bağlantıya sahip isteğe bağlı birleştirme hala
- 16. İsteğe bağlı özellik
- 17. Ninj. İsteğe Bağlı Enjeksiyon
- 18. Salatalıkta isteğe bağlı parametre
- 19. subprocess.Popen isteğe bağlı bağımsız değişkenler
- 20. Raylar modelleri, isteğe bağlı olarak oluşturulmasına neden olur. AssociationTypeMismatch
- 21. raylar 4 has_secure_password render şifre onayı isteğe bağlı
- 22. Swift 2.2 isteğe bağlı/isteğe bağlı istekleri keser
- 23. İsteğe bağlı tuşları ile desen eşleştirme haritası
- 24. Aeson - Haskell ile isteğe bağlı JSON anahtarları
- 25. Raylar 4 Kuvvetli Parametreler - Model Parametreler Hash
- 26. İsteğe bağlı (nil)
- 27. İsteğe Bağlı PORTlar?
- 28. Verilen isteğe bağlı koleksiyon
- 29. Swift: İsteğe bağlı değişken
- 30. Regex isteğe bağlı tırnak
ben ama bunu yapabilirim nasıl parametre birinde koşulu daha büyük olan mongoid sorgunun aynı tür çalıştırmak gerekirse lütfen bana ? Umarım anlarsın! –