DataMapper で relation を使った検索
ドキュメントに載ってないことを補足していこうシリーズ。
DataMapper で、たとえば次のようなモデルクラスがあるとする。
### 従業員 class Employee include DataMapper::Resource property :id, Serial property :name, String, :nullable => false property :department_id, Integer belongs_to :department end ### 部門 class Department include DataMapper::Resource property :id, Serial property :name, String, :nullabel => false, :unique_index => true has n, :employees end
ここで、従業員の名前で検索するには次のようにする (これはよく知られている)。
- 「Employee.all(:name => "Kathy")」とすると、名前が Kathy である従業員
- 「Employee.all(:name.not => "Kathy")」とすると、名前が Kathy でない従業員
また relation を使った検索は、次のようにする (これはドキュメントに載ってないと思う)。
- 「Employee.all("department.name" => "Sales")」とすると、所属部門の名前が Sales である従業員
- 「Employee.all("department.name.not" => "Sales")」とすると、所属部門の名前が Sales でない従業員
実行例:
$ merb -i irb> Employee.all("department.name"=>"Sales") ~ SELECT "employees"."id", "employees"."name", "employees"."department_id" FROM "employees" INNER JOIN "departments" ON ("departments"."id" = "employees"."department_id") WHERE ("departments"."name" = 'Sales') ORDER BY "employees"."id" => [#<Employee id=3 name="Kathy" department_id=1>] irb> Employee.all("department.name.not"=>"Sales") ~ SELECT "employees"."id", "employees"."name", "employees"."department_id" FROM "employees" INNER JOIN "departments" ON ("departments"."id" = "employees"."department_id") WHERE ("departments"."name" <> 'Sales') ORDER BY "employees"."id" => [#<Employee id=4 name="Jack" department_id=2>, #<Employee id=5 name="Bill" department_id=2>, #<Employee id=6 name="Scott" department_id=3>]