ID、郵便番号、市区町村、州などの多くのオプションのパラメータを検索で提供できる場合、データベースの検索はどのように行いますか?これらは値を持つことも、完全に空白にすることもできます。私はどのようにしてレールのクエリを作成しますか?Railsオプションのパラメータで検索しますか?
答えて
クエリを構築することができます
conditions = {}
conditions[:city] = city unless city.blank?
conditions[:zip] = zip unless zip.blank?
conditions[:state] = state unless state.blank?
Address.find(:all, :conditions => conditions)
通常のアドバイスはモデルにロジックを移動し、できるだけ無駄のように、コントローラを維持することです。フィルタ法、最初のもののための異なるアプローチがある:
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
第2の方法は、唯一の既存のスコープを使用することfilter
裸を書き込む:
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
今ActionControllerを使用してレール5の場合: :パラメータは、フィルタメソッドの構文は次のとおりです。
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
モデルはどこでもあなたのアプリでから呼び出されたので、彼らは再利用し、テストするのが容易であることができます。
class RecordsController < ApplicationController::Base
respond_to :html, :xml
def index
@records = Record.filter(params)
end
end
+1コントローラーをシンプルに保つための良い方法 – zetetic
@tokland私はあなたのソリューションを使いました。 http://railscasts.com/episodes/112-anonymous-scopesとhttp://railscasts.com/episodes/111-advanced-search-formよりも洗練されています。どうもありがとう! –
このソリューションには潜在的なメモリリーク/ DoS攻撃の脆弱性はありませんか? Ex、誰かが大量のクエリ文字列を送信し続けると、モデルはランダムなクエリ文字列をkey.to_sym'ingします。 –
http://metautonomo.us/projects/metasearch/は何が必要です:今、コントローラは、のように簡単に見えます。
= text_field_tag 'search[city_like]', ''
= text_field_tag 'search[zip_equals]', ''
= text_field_tag 'search[state_equals]', ''
そしてちょうど
Record.search(params[:search])
- 1. 「検索」オプションを削除しても「検索列」オプションを残す
- 2. Netbeansの検索オプションで「*」を文字列として検索
- 3. Railsでの検索
- 4. Rails 3 - ネストされた検索の検索モデルにパラメータを渡す
- 5. 漢字の検索にはどの検索オプションと比較オプションを使用しますか?
- 6. ヒーローホストのRailsアプリに最適な検索オプションはありますか?
- 7. Bing APIの例でRailsサイトを検索しますか?
- 8. resolv.confのドメインと検索オプション
- 9. Webアプリケーションのテキスト検索オプション?
- 10. jQueryデータ型の検索オプション
- 11. Rails 3での検索
- 12. Rails検索/チェックボックスロジック
- 13. いくつかのオプションの検索用語を含むパラメータ化されたクエリ
- 14. Railsクエリ - フィールドで配列インデックスを検索しますか?
- 15. Symfony、url_for検索パラメータ
- 16. Rails - 検索または作成 - 検索またはビルドはありますか?
- 17. Laravel(php)save検索オプション
- 18. 検索:-printf:不明なオプション
- 19. Ruby On Railsで検索
- 20. Drupal 7の検索パラメータ
- 21. location.href +検索パラメータの指定
- 22. Rails 3.ライブ検索
- 23. Rails/Ruby。ダブルメールの検索
- 24. Rails collection_select検索の問題
- 25. Railsの検索方法
- 26. RailsのThinkingSphinx検索の検索結果をフィルタリングする
- 27. 検索SQLサーバーの複数のオプション
- 28. アンドロイドのGoogleマップの検索オプション
- 29. SQL Server 2005の複数の検索オプション
- 30. Rails 3とMetaSearchで検索する
私は、パラメータの一つでmongoidではなく、条件よりも大きいと、クエリの同じ種類を実行する必要がある場合、あなたはどのように私はそれを行うことができ、私に教えてくださいすることができ?あなたが理解することを願って! –