Powered by SmartDoc

Qualifier

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()が使われます。