1

Rails3.2.2とMySQLを使用しています。私はユーザー名(たとえば、、、)でデータベーステーブルの列を次のように検索してJohnAnthonyますMark

# User controller
User.search_by_name(params[:search]).order(:name)

# User model
def self.search_by_name(search)
  if search
    where('users.name LIKE ?', "%#{search}%")
  else
    scoped
  end
end

ただし、名前は2つJohn Henry以上Henry Johnの文字列(たとえば、、、、、、、)で構成できるため、複数の名前が指定されている場合もユーザーを検索したいと思います。使ってみましたAnthony MariaMaria AnthonyMark AlfredAlfred Markparams[:search]

def self.search_by_name(search)
  if search
    search.split(' ').each do |string|
      where('users.name LIKE ?', "%#{string}%")
    end
  else
    scoped
  end
end

しかし、次のエラーが発生します(たとえば、検索している場合John Henry):

NoMethodError (undefined method `order' for ["John", "Henry"]:Array).

複数の名前を適切に検索するにはどうすればよいですか?

4

2 に答える 2

1

私はあなたが次のいずれかを行うべきだと完全に思います、

Mysql全文検索:

http://devzone.zend.com/26/using-mysql-full-text-searching/

SphinxSearch:

http://www.ibm.com/developerworks/library/os-php-sphinxsearch/

  • さまざまなクールな機能が組み込まれているので、sphinxsearchをお勧めします。
  • スフィンクスのサポートも素晴らしいです!
于 2012-05-21T09:08:34.793 に答える
1

squeelgemを使用します。

def self.search_by_name(search)
  if search
    where(name.like_any search.split)
  else
    scoped
  end
end

これは、一致するレベルで並べ替えられないことに注意してください。そのためには、スフィンクス、solr、xapianのgemなどの検索エンジンの実装が必要です。

また、条件を「OR」することを意図していたため、それぞれの元の使用法は不適切であることに注意してください。検索用語と同じ数のdbクエリを発行してもかまわない場合は、一致レベルの順序を偽造することもできます。

def self.search_by_name(search)
  if search
    results = search.split.map do |string|
      where('users.name LIKE ?', "%#{string}%").all
    end.flatten
    ids = results.map(&:id)
    # desc order by count of matches
    ordered_results = results.uniq.order { |result| -ids.count(result.id) }
  else
    scoped.all
  end
end

これは、さらにスコープを設定できるArel関係ではなく、単純な配列です。'all'呼び出しに注意してください。したがって、大きなデータベースでこれを試みないでください。また、検索が「a b」などの場合、これは「ba」の上に「ab」を並べ替えないことに注意してください。だから、私はちょっと楽しんでいます。

于 2012-05-21T10:24:36.683 に答える