2011-10-25 9 views
1

Railsアプリケーション内でいくつかの検索機能を実装する必要があります。私が見つけたもののほとんどは、一般的に単純なプレーンテキスト検索を目的としています。私はもっ​​と具体的なものを実装しようとしています。私が作成しているよ機能の並べ替えは、(Cアプリケーションから)これです:Rails 3の複雑な検索画面

http://andyc.ac/query.gif

形だけのユーザーが入力したデータを送信します。だから、 "3..7"のような文字列をwhereメソッドのSQL条件に変換する必要があります。

TestLine.where("test_int >= ? and test_int <= ?", MinInt, MaxInt) 

これは既にどこかに存在するようです。ユーザーがRailsとCアプリケーションの間で共有されないため、期待される正確な形式はそれほど重要ではありません。これはどのようにして行われますか?

+0

あなたのモデルでスコープを使用しないのはなぜですか? –

+0

ダイアグラムには素晴らしい質問が含まれています。 +1 – sscirrus

答えて

1

FWIWあなたが記述する特定の機能は、実際に直接サポートされています。よくほとんど。 the docsから:

範囲は、SQL BETWEEN演算子を使用してハッシュに使用することができる。もちろん

Student.where(:grade => 9..12) 

を、それは、どの範囲まで、ユーザの文字列入力を翻訳の問題です例えば、非常に複雑ではありません:それはおそらくあなたのモデルにscopeで最も理にかなって

def str_to_range str 
    str =~ /(\d+)\.\.(\d+)/ 

    Range.new *$~.captures.map(&:to_i) 
end 

。 (もちろん、ショートカットはeval '9..12'ですが、エンドユーザからの入力はevalです。)

+0

ありがとう私もこれを検討しています:私は、Cアプリケーションからクエリlibの何千ものコード行を書き換えることに躊躇していましたが、試してみると、コードの! – asc99c

+0

これは私が行くつもりのように見えます。私はSQLiteが文字列フィールドのBETWEEN節を好きではないことを発見しました(私たちは文字列ですが大部分は数値です)ので、その問題を回避するためにデータベースを切り替えるつもりです。 – asc99c

+0

文字列の比較と数値の比較が異なることが多いため、注意してください。したがって、 '5'は「1と10の間」であるかもしれませんが、「5」は「BETWEEN 1とAND 10」(数学とアルファベットを考える)かもしれません。回避策は、文字列を数値としてキャストすることです(例: 'BETWEEN CAST(str_val AS INT)とCAST(other_str_val AS INT)'です。これにより、おそらくデータベースプラットフォームを切り替える手間が省けます。 –

1

sphinx(http://freelancing-god.github.com/ts/ja/)を考えてみてください。あなたの仕事がずっと楽になるかもしれません。その中で検索することができます: http://freelancing-god.github.com/ts/en/searching.html#basic

+0

ありがとうございます、私は現在これを調べています。それはうまく見えますが、すべてのモデルのすべてのフィールドで検索できるように実際に最適化されているかどうかはわかりません。 – asc99c

関連する問題