2010-11-21 38 views
1

J'essaie d'effectuer une requête simple, mais Datamapper ne semble pas retourner les bons ensembles de résultats.Datamapper n'effectuant pas la bonne requête

Cela semble tellement basique qu'il n'y a aucune raison pour que ce soit faux.

Je pense que c'est probablement un problème de syntaxe.

class User 
has n, :answers 
property :id, Serial 
property :name, String 
end 

class Answer 
belongs_to :user 
has n, :topics, :through => Resource 
property :id, Serial 
property :text, Text 
end 

class Topic 
has n, :answers, :through => Resource 
property :name, String, :key => true 
end 

o=User.create(:name=>'tom') 
puts a=Answer.create(:user=>o, :text => 'a1', :topics => [ 
Topic.first_or_create(:name => 'aboutme'), 
Topic.first_or_create(:name => '@onetom') 
]) 

#THIS WORKS 
#puts Answer.all(:user => {:name => 'tom'}, :topics => [{:name => 'aboutme'}]) 

#THIS DOES NOT WORK 
#puts o.answers.all(:topics => [{:name => 'aboutme'}]) 

Répondre

3

Vous n'utilisez pas de paramètres corrects. Si vous souhaitez ajouter des conditions à des associations, vous devez utiliser la notation par points. J'ai fait un exemple de script pour vous ici:

https://gist.github.com/709867

+0

Merci! Problème résolu! = D –

0

Il y a une possibilité de l'existence d'un bogue dans le code des relations (il semble que vous utilisez les attributs imbriqués plugin?)

Une bonne chose DataMapper est que vous pouvez vérifier ce que la requête est en train d'être généré. Marquez simplement ".query" à la fin de n'importe quelle collection et vous obtiendrez l'objet de requête.

Answer.all(:user=>{:name=>'tom'}, :topics => [{:name => 'aboutme'}]).query dans ce cas.

Vous pouvez également voir ce que SQL la requête générerait en procédant comme suit:

q = Answer.all(:user=>{:name=>'tom'}, :topics => [{:name => 'aboutme'}]).query 
DataMapper.repository.adapter.send(:select_statement, q) 

Donnez un coup de feu et republier de savoir si elle fait quelque chose de bizarre ou non (ou même afficher les objets de requête généré et je peux jeter un coup d'oeil).