QualifierはSQLのWHERE句にあたるクラスで、データベースから検索する行を指定します。検索条件はQualifierのサブクラスを組み合わせて構成されますが、Qualifier#format()
を使って条件式を指定するのが簡単です。
qualifier = Qualifier.format("name like 'J*'")
まず、条件式の例をいくつか示します。
name == 'MyName' register_date > '2000/1/1' (title like 'R*') and (publisher.name like 'O*') not (time < 20)
基本的に「属性 オペレータ 条件」で条件式を記述します。複数の条件式をつなげるにはand
/or
を、否定の条件式にするにはnot
を条件式の前に記述します。論理演算子を使うときは、条件式をかっこで囲んでください。
リレーションシップ名と属性をピリオドでつなぐと、リレーション先のオブジェクトの検索条件も指定することができます。こうすると、リレーション先のオブジェクトの検索条件が合致するオブジェクトのみを検索できます。
使用できるオペレータを次に示します。
オペレータ | 説明 |
---|---|
=, == |
両辺が同じ。 |
!= |
両辺が異なる。 |
> |
左辺が右辺より大きい。 |
< |
左辺が右辺より小さい。 |
>= |
左辺が右辺より大きいか、同じ。 |
<= |
左辺が右辺より小さいか、同じ。 |
like |
文字列の部分的な一致を指定する。 |
cilike |
文字列の部分的な一致を指定する。ただし、アルファベットの大文字小文字を区別しない(case insensitive)。 |
SQLではワイルドカードの文字に"%"と"_"を使いますが、TapKitでは"*"と"?"を使います。"*"は任意の長さの文字列に、"?"は任意の1文字にマッチします。
ワイルドカードの文字をエスケープするときは、文字の前にバックスラッシュをつけてください。
Qualifierの条件式には、組み込み関数のprintf()
と同じように指示子を含めることもできます。Qualifier#format()
の第2引数にオブジェクトの配列を与えます。
指示子 | 説明 |
---|---|
%s |
オブジェクトを文字列として置き換える。 |
%d |
オブジェクトを整数として置き換える。 |
%f |
オブジェクトを浮動小数点数として置き換える |
%@ |
String なら文字列、Fixnum なら整数など、オブジェクトに応じたデータ型に置き換える。 |
%K |
属性名として解釈する。オブジェクトが文字列以外であれば、それに応じたデータ型に置き換える。 |
%% |
%をエスケープする。%の文字自体を入力するのに使う。 |
%s
と%@
を使うときは、文字列がクォートで囲まれることに注意してください。ワイルドカードを条件式ではなく引数のオブジェクトに含める必要があります。
# 正しく解釈される name = 'Paul*' qualifier = Qualifier.format("name like %@", [name]) puts qualifier #-> "name like 'Paul*'" # 正しく解釈されない name = 'Paul' qualifier = Qualifier.format("name like '%@*'", [name]) puts qualifier #-> "name like ''Paul'*'"
条件式に記述できるデータは文字列と数値のみですが、クラスを指定することで様々なオブジェクトを使った検索ができます。日付の検索はこの方法で行います。
# 条件式に書く q = Qualifier.format("stamp = (Timestamp)'2000-01-01 12:34:56'") # 指示子 %@ を使う stamp = Timestamp.now q = Qualifier.format("stamp = %@", [stamp])
変換はクラス名と同名の関数を使って行われます。この例ではTapKit::Timestamp()
が使われます。