会社と従業員の 2 つのモデルがあるとします。会社には多くの従業員がいて、従業員は会社に所属しています。
レールでは、単純なものがあります:
class Company < ActiveRecord::Base
has_many :employees
end
class Employee < ActiveRecord::Base
belongs_to :company
end
次のようなクエリを実行できます。
Employee.where(company_id: 1)
それでは、Core Data でこれを行う方法を見てみましょう。Company と Employee という 2 つのエンティティを作成しました。それぞれに NSManagedObject suclasses を生成しましたが、特定の会社の従業員を返す単純な再利用可能なクエリを実行したいと考えています。
まず、Employee+queries というカテゴリを作成しました。Employee+queries.h には、次のものがあります。
@interface Employee (queries)
+ (NSArray *)whereCompanyIDis:(int)companyID;
@end
Employee+queries.m には、次のものがあります。
@implementation Employee (queries)
+ (NSArray *)whereCompanyIDis:(int)companyID {
NSManagedObjectContext *context = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Company"];
request.predicate =[NSPredicate predicateWithFormat:@"id = %d", companyID];
NSError *error;
NSArray *companies = [context executeFetchRequest:request error:&error];
Company *company = [companies objectAtIndex:0];
return [company.employees allObjects];
}
@end
私は次のことを行います:
- NSManagedObjectcontext を取得する
- 会社のリクエストを作成する
- クエリを実行します
- 結果の最初の要素を取得します (会社ごとに一意の ID があるため、1 つしかありません)
- company.employees は NSSet なので、TableViewController で使用できる NSArray に変換します
今、必要なコントローラーで、次のことができます。
NSArray *employees = [Employee whereCompanyIDis: 1]
会社IDを指定して会社の従業員の配列を取得するだけで、私がやろうとしていることは非常に複雑に思えます。
そのコードをどのようにリファクタリング/再編成しますか? ここで完全に欠けているベストプラクティスはありますか?
どうもありがとう、ニコラス