1

私のアプリケーションではhas_scopegem とを使用thinking sphinxし、モデルでは次のように記述しました。

scope :by_description, -> description { where("description like ?", "%#{description}%") if description.present?}

そして、コントローラーで:

has_scope :by_description

def somemimimi
  @cars = apply_scopes(Car).order(created_at: :desc).page(params[:page]).per(20)
end

しかし、次のようなものを書き込もうとしたとき:

scope :by_description, -> description { search description}

次のエラーが発生しました

 you cannot search with Sphinx through ActiveRecord scopes

しかし、私はスフィンクスでも検索します(このパラメータが提示されたとき)。どうすればこの問題を解決できますか?

4

1 に答える 1

0

gem が Thinking Sphinx スコープで動作するかどうかはわかりませんhas_scopeが、モデルで次のことを試すことができます (既存の ActiveRecord スコープを置き換えます)。

include ThinkingSphinx::Scopes

sphinx_scope(:by_description) { |description| description }

whereただし、このスコープが返すのは ActiveRecord リレーションではなく、Thinking Sphinx 検索オブジェクトであるため、 or などの ActiveRecord メソッドと組み合わせて使用​​することはできませorderん (また、ActiveRecord スコープを呼び出すこともできません)。そのため、コントローラーでの呼び出しの後にチェーンするものをapply_scopes調整する必要があります。おそらく次のようになります。

@cars = apply_scopes(Car).search(order: 'created_at DESC', page: params[:page], per_page: 20)

has_scopeただし、これはすべて、 gem のアプローチが単純であり、ActiveRecord スコープであるかどうかに関係なく、指定されたモデルでクラスレベルのメソッドを呼び出すだけであるという前提に基づいて構築されています。

gemの変更による問題を回避するという観点から、has_scopeThinking Sphinx クエリでは使用しないことをお勧めします。

于 2014-04-01T12:37:20.270 に答える