2013-09-28 3 views
1

Скажем, у меня есть два картографа данных классов, как это:иностранных Упоминание в картографа данных

class Family 
    include DataMapper::Resource 

    property :id, Serial 
    property :nice, Boolean 
end 

Class Person 
    include DataMapper::Resource 

    property :id, Serial 

    belongs_to :family 
end 

Если я хочу, чтобы все люди, принадлежащие к определенной семье family, я могу использовать это:

people=Person.all(:family=>family) 

Но что, если я хочу получить всех людей, принадлежащих к семейству, у которых есть атрибут nice? В SQL я мог бы сделать

SELECT * FROM persons, families WHERE persons.family_id=families.id AND families.nice 

Есть хороший способ сделать это в картографа данных, не опуская к базовому набору данных?

ответ

1

Необходимо указать, что у Family есть несколько Person s. См. documentation on has n and belongs_to.

class Family 
    include DataMapper::Resource 

    property :id, Serial 
    property :nice, Boolean 

    # add this: 
    has n, :people 
end 

Затем вы можете использовать это:

Family.all(:nice => true).people 

SQL, генерируемый фактически подзапрос, а не присоединиться:

SELECT "id", "family_id" FROM "people" WHERE "family_id" IN (SELECT "id" FROM "families" WHERE "nice" = 't') ORDER BY "id" 
+0

благодаря другим Matt :) –

Смежные вопросы