2010-07-06 7 views
2

J'ai deux modèles qui ressemblent à ceRecherche par association (DataMapper)

class Stage 
    include DataMapper::Resource 
    property :id, Serial 
    belongs_to :staff 
end 

class Staff 
    include DataMapper::Resource 
    property :id, String, :key => true 
    property :full_name, String 
    property :email, String 
    has n, :stages 
end 

J'essaie de trouver toutes les étapes qui ont un membre spécifique du personnel affecté. J'ai essayé @stages = Stage.all(Stage.Staff => 'TM')

Qu'est-ce que je fais mal?

Répondre

1

Essayez cela, sa fait un moment que je l'ai utilisé DataMapper.

Stage.all(Stage.staff.id => 'TM') 

Cela suppose que le « TM » serait en fait la valeur que vous utilisez pour l'identifiant du membre du personnel.

+0

Merci, cela a fonctionné un régal. – Tom

0

Je ferais

@stages = Stage.all(:staff => 'TM') 
+0

Il ne renvoie pas d'erreur, mais ne renvoie aucune donnée non plus. Si je l'exécute sur d'autres champs tels que le titre, cela fonctionne bien, mais pas pour la clé étrangère? – Tom

+0

@Tom Je ne peux pas le tester, je suggère d'essayer d'indiquer l'association avec: liens par ex. 'Stage.all (: links => [: staff], Stage.staff.id => 'TM')' – philant

2

En fait, vous pouvez utiliser les touches de chaîne dans DataMapper comme ceci:

Stage.all('staff.id' => 'TM') 

ou

Stage.all('staff.name.like' => 'Ted%') 

Vous pouvez mélanger et assortir avec des propriétés dans ce modèle ainsi:

Stage.all('staff.name.like' => 'Ted%', 'id.gte' => 5) 

Cela fera en sorte que toutes les étapes appartiennent à des personnes dont le nom commence par «Ted» et qui ont un identifiant supérieur ou égal à 5.

+0

Ne connaissait pas le%, merci – Tom

+0

Pour être clair, le% est une syntaxe de correspondance de chaîne partielle SQL. Vous pourriez aussi avoir fait Stage.all ('staff.name' =>/^ Ted /) :) et DataMapper est assez intelligent pour savoir comment faire la correspondance/traduction. – knowtheory

Questions connexes