Powered by SmartDoc

FetchSpec

FetchSpecではフェッチの詳細を設定します。検索するエンティティ名、Qualifierオブジェクト、SortOrderingオブジェクトの配列をセットし、あとはFetchSpecオブジェクトをEditingContext#fetch()の引数に与えればデータを検索できます。

ec = application.create_editing_context
qualifier = Qualifier.format("name like 'J*'")
sort1 = SortOrdering.new('name', SortOrdering::ASC)
sort2 = SortOrdering.new('name', SortOrdering::DESC)
sorts = [sort1, sort2]
fetchspec = FetchSpec.new('Person', qualifier, sorts)
objects = ec.fetch(fetchspec)

SortOrderingオブジェクトは省略できます。省略した場合のオブジェクトの順序は、データベースが返した順序になります。

ec = application.create_editing_context
qualifier = Qualifier.format("name like 'J*'")
fetchspec = FetchSpec.new('Person', qualifier)
objects = ec.fetch(fetchspec)

フェッチの詳細を設定する

オブジェクトの数を制限する

FethSpecに何も設定しないでフェッチすると、該当するデータベースのデータをすべて読み込みます。データ数が多いと、データをフェッチにも、オブジェクトの作成にもかなりの時間がかかってしまいます。このようなときはlimit属性にフェッチするオブジェクトの数を制限しておきます。

fetchspec.limit = 20

オブジェクトの再フェッチ

同一のEditingContextでフェッチしたオブジェクトに対して、再度同じ条件でフェッチしても新しいオブジェクトが作成されることはありません。これはデータの一意性を保証するというメリットがありますが、変更したオブジェクトを元に戻したいときや最新のオブジェクトに更新したいときに、かえって邪魔になることがあります。その場合、refresh属性をtrueに設定して再度フェッチを行い、オブジェクトを更新します。

fetchspec.refresh = true
objects = ec.fetch(fetchspec)

ほかには、新しいEditingContextを生成して再フェッチを行う方法もあります。ただし、新しいEditingContextでフェッチしたオブジェクトは、他のEditingContextでフェッチしたオブジェクトとは異なることに気をつけてください。内部では別のオブジェクトとして管理され、例えまったく同じデータを持つとしても、比較して真になることはありません。