2017-01-04 6 views
0

現在のレコードのみを検索するsphinx_scopeが必要です。各データベースレコードのフィールドはstatusで、値はCURRENTまたはARCHIVEDのいずれかです。sphinxスコープの検索で引用符が見つからない

私はこれを達成しましたが、そこに行くためには奇妙な構造を使わなければなりません。おそらくもっと良い方法があります。

は、ここで私が持っているものです。

インデックス/ letter_index.rb

ThinkingSphinx::Index.define :letter, :with => :real_time do 
    # fields 
    indexes title, :sortable => true 
    indexes content 

    # attributes 
    has status, :type => :string 
    has issue_date, :type => :timestamp 
    has created_at, :type => :timestamp 
    has updated_at, :type => :timestamp 
end 

モデル/ letter.rb

class Letter < ActiveRecord::Base 
    include ThinkingSphinx::Scopes 
    after_save ThinkingSphinx::RealTime.callback_for(:letter) 

    .. snip .. 

    sphinx_scope(:archived) { 
    {:with => {:status => "'ARCHIVED'"}} 
    } 

私はに走った問題は、私は:with => {:status => 'ARCHIVED'}を使用した場合ということでした、私のクエリは、

SELECT * FROM `letter_core` WHERE MATCH('search term') AND `status` = ARCHIVED AND `sphinx_deleted` = 0 LIMIT 0, 20 
ThinkingSphinx::SyntaxError: sphinxql: syntax error, unexpected IDENT, expecting CONST_INT (or 4 other tokens) near 'ARCHIVED AND `sphinx_deleted` = 0 LIMIT 0, 20; SHOW META' 

ですが、:with => {:status => "'ARCHIVED'"}というように構成すると、一重引用符が追加され、クエリが成功します。 :)

これはスコープを書くための適切な方法ですか、それとも良い方法ですか?

ボーナス質問:私はスコープで許可されているもののためのドキュメントを見つけるか、など:order:with:conditionsなどなど

答えて

0

まず:引用符の必要性がバグだった - スフィンクスは、比較的最近になっています文字列属性のフィルタリングが許可されています。なぜ、これは良い前に何かが存在しなかったのです。で行くことができるものについては

gem 'riddle', '~> 2.0', 
    :git => 'git://github.com/pat/riddle.git', 
    :branch => 'develop', 
    :ref => '8aec79fdf4' 

:私はリドル(スフィンクス機能とスフィンクスを考えることにより、使用の周りの純粋なRubyのラッパーである宝石)をパッチしてきた、あなたはあなたのGemfileでこれで最新のスピンを与えることができますスフィンクススコープ:通常の検索呼び出しで使用できるもの。

+0

これで解決します。これをいつgemfileから削除できるのかをどのように知ることができますか? –

+0

さて、開発中に修正されました。しかし、生産は壊れました...スフィンクスは2.0.4でした。私は、スフィンクスのバージョンが違っていたことに気づいていませんでした。 [2.2.11](http://sphinxsearch.com/downloads/release/)に更新 - [127.0.0.1にバインドできませんでした](https://github.com/pat/thinking-sphinx/issues/ 857) - 'sudo service sphinxsearch stop'と' bundle exec rake ts:regenerate'を実行します。うわー、3時間のヘッドバンギングが1つの文に縮まった! –

+0

Riddleのv2.1.0をリリースしました.Gemfileからそのリストを削除し、 'bundle update riddle'を実行すると2.1.0を使用していることを確認する必要があります。そしてあなたが痛みを改善していると聞いて申し訳ありませんが、あなたはそれがすべて理解されたことを知っていることも素晴らしいです! – pat

関連する問題