0

私はいくつかの概念を実験しています(実際には、1978年のデータベースWHATSITのRoRバージョンを構築して遊んで学習しています)。

これは基本的にhas_many:through構造であり、Subject->Tags<-Valueがあります。クエリテキストフィールドを使用してコマンドを入力することにより、コマンドライン構造の一部を複製しようとしました。基本的に次のようなものですWhat's steve's phone

とにかく、そのインターフェースでは、ほとんどの検索でILIKEが使用されます。私は、何らかの形式の配列を使用してOR条件を許可することによってそれを強化することについて考えています。のようなものWhat's steve's [son,daugher]。ILIKE句を直接作成することで機能しましたが、文字列を置き換えることはできませんでした。

def bracket_to_ilike(arrel,name,bracket)
  bracket_array = bracket.match(/\[([^\]]+)\]/)[1].split(',')
  like_clause = bracket_array.map {|i| "#{name} ILiKE '#{i}' "}.join(" OR ")
  arrel.where(like_clause)
 end  

bracket_to_ilike(tags,'tags.name','[son,daughter]')like句を生成しますtags.name ILiKE 'son' OR tags.name ILiKE 'daughter'

そして、それは関係を取得しますが、フォームの使用についてのすべての話で ("tags.name ILiKE ? OR tags.name ? ",v1,v2,vN..)、私は誰かがそれを行う方法について何かアイデアを持っているかどうか尋ねたいと思います。

その場で変数を作成することは、私が検索したものから実行可能ですが、賛成ではありません。可変数のパラメーターを持つwhere句を追加できるメソッドを作成しようとした人がいるかどうか疑問に思いました。where句をリレーションに送信しようとしましたが、気に入らなかったのです。

スティーブ

4

2 に答える 2

0

コードで注意すべきことがいくつかあります...

  • bracket_array の要素の 1 つに一重引用符が含まれているとどうなりますか?
  • さらに一歩進んで、「'; drop tables...」という要素を設定するとどうなるでしょうか?

コードをリファクタリングする最初の試みは、Arel がそれを実行できるかどうかを確認することです。または、続編、または最近の「メタウェア」宝石と呼ばれるもの. 私の2番目の刺し傷は次のようなものです:

arrel.where( [ bracket_array.size.times.map{"#{name} ILIKE ?"}.join(' OR '), *bracket_array ])

テストはしませんでしたが、bracket_array のサイズを使用して OR 条件の文字列を生成し、splat 演算子を使用してすべての値を渡すという考え方です。

于 2012-12-31T20:55:04.093 に答える
0

私を正しい方向に向けてくれた Phillip に感謝します。

  • 配列をwhere句に渡すことができるとは知りませんでした-いくつかのオプションが開かれました
  • スプラット演算子を数回使用しましたが、実際にオブジェクト(変数)を作成することに気づきませんでした

[息子、娘] のことは、私が何ができるかを確認するためのコンソールの演習にすぎませんでしたが、それで何をするかはわかりませんでした。モデルの関連付けを取得し、画像から配列を作成して、OR 検索を実装することになりました。

def array_to_ilike(col_name,keys)
  ilike = [keys.map {|i| "#{col_name} ILiKE ? "}.join(" OR "), *keys ]
  #ilike = [keys.size.times.map{"#{col_name} ILIKE ?"}.join(' OR '), *keys ]
  #both work, guess its just what you are use to.
end  

次に、件名、タグ、値の検索でパイプ (|) 文字を許可したので、WHATSIT スタイルの質問

  • What's Steve's Phone Home|Work=> 自宅と職場の電話を表示
  • steve phone home|workのものは見せかけだけのものです
  • steve son|daughter =>子を表示します
  • phone james%|lori%=> 名前が james または loli で始まる人の電話番号を表示します
  • james%|lori% => 名前が james または loli で始まる人のすべての情報をダンプします

次に、クエリはコマンドを解析し、| が検出された場合 どの単語でも、次のようなことを行います。

t_ilike = array_to_ilike('tags.name',name.split("|"))
# or I actually stored it off on the inital parse
t_ilike = @tuple[:tag][:ilike] ||= ['tags.name ilike ?',tag]

繰り返しますが、これは、解析と検索を処理するための非 CRUD クラスを作成するための単なる学習演習です。

スティーブ

于 2013-01-01T23:20:55.557 に答える