1

http://railscasts.com/episodes/340-datatablesで提案されているようなデータテーブルを実装しましたが、問題なく動作します。残念ながら、入力フィールドでスペースを使用して検索するという点には関係ありません。JavaScriptで処理する検索機能で実装すると、問題なく動作します。

だから私がしたいのは、SQLのパラメータがスペース(パラメータの動的サイズ)で分割されている多くのフィールドでデータベースを検索することです。"name1 street city" -> これは、返されるオブジェクトのいずれかのオブジェクト フィールドに、"name1"、"street"、"city" の 3 つすべてが含まれている必要があることを意味します。

例を次に示します: Person :name, :address, :city, :country

Person("ピーター・メイヤー"、"111番街"、"ニューヨーク"、"アメリカ合衆国")

  • ユーザーが「Peter York」で検索すると、オブジェクトが見つかるはずです
  • ユーザーが「Peter Los Angeles」で検索すると、何も見つからないはずです
  • ユーザーが「111 Mayer States York」で検索すると、オブジェクトが見つかるはずです

わかりました、私はパラメータの量を考慮して多くの異なるSQLを書くことができましたが、それはあまり良くありません

それを解決する簡単な方法はありますか?

ページネーションが機能しなくなるため、最初のパラメーターのみで検索した後のフィルタリングはオプションではありません

4

2 に答える 2

0

私は今このようにしました:

searchData = params[:sSearch].split(" ")

searchString = "1 = 1"
searchParams = {}
i = 0
searchData.each do |searchParam|
    searchString += " AND (persons.name like :search"+i.to_s+" or persons.address like
     :search"+i.to_s+" or persons.city like :search"+i.to_s+" or persons.country like    
     :search"+i.to_s+"+")"

    searchParams["search#{i}".to_sym] = "%"+searchParam+"%"
    i += 1
end

Person.where(searchString, searchParams)
于 2012-12-30T16:46:23.477 に答える
0

次のことができます。

  1. 1 つの文字列で見つけなければならないすべての属性を結合します

    search_attributes = [person.name1, person.address, person.city, person.country].join(' ') あなたの例では、次のようsearch_attributesになります"Peter Mayer Some Street 111 New York United States"

  2. 次に、クエリ内のすべての文字列を反復処理し、それがsearch_attributesusing.include?で見つかることを確認し、送信されたクエリ内のすべての文字列が で見つかった場合にのみレコードを返します。search_attributes

于 2012-12-29T11:58:54.640 に答える