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でフェッチしたオブジェクトとは異なることに気をつけてください。内部では別のオブジェクトとして管理され、例えまったく同じデータを持つとしても、比較して真になることはありません。