Question

J'ai ces deux classes,

class User
   include DataMapper::Resource
   property :id, Serial
   property :name, String

   has n :posts, :through => Resource

end

class Post
   include DataMapper::Resource
   property :id, Serial
   property :title, String
   property :body, Text

   has n :users, :through => Resource
end

Donc, une fois que j'ai un nouveau message comme:

Post.new(:title => "Hello World", :body = "Hi there").save

J'ai de graves problèmes à ajouter et à retirer de l'association, par exemple:

User.first.posts << Post.first #why do I have to save this as oppose from AR?
(User.first.posts << Post.first).save #this just works if saving the insertion later

Et comment dois-je supprimer un message de cette association? J'utilise ce qui suit, mais cela ne fonctionne définitivement pas:

User.first.posts.delete(Post.first) #returns the Post.first, but nothing happens
User.first.posts.delete(Post.first).save  #returns true, but nothing happens
User.first.posts.delete(Post.first).destroy #destroy the Post.first, not the association

Je ne sais donc vraiment pas comment le supprimer du tableau BoltUser.

Était-ce utile?

La solution

La méthode delete () et les autres méthodes de Array ne fonctionnent que sur la copie en mémoire des Collections. En fait, ils ne modifient rien tant que vous ne persistez pas dans les objets.

De plus, toutes les actions CRUD effectuées sur une collection affectent principalement la cible. Quelques-uns, comme create () ou destroy (), ajouteront / supprimeront les ressources intermédiaires dans plusieurs collections, mais ce n'est qu'un effet secondaire de la création ou de la suppression de la cible.

Dans votre cas, si vous souhaitez supprimer uniquement le premier message, vous pouvez le faire:

User.first.posts.first(1).destroy

La partie User.first.posts.first (1) renvoie une collection dont l'étendue ne concerne que le premier message. L'appel de destruction sur la collection supprime tout ce qui se trouve dans la collection (ce qui n'est que le premier enregistrement) et inclut les intermédiaires.

Autres conseils

J'ai réussi à le faire en faisant:

#to add
user_posts = User.first.posts
user_posts << Bolt.first
user_posts.save 

#to remove
user_posts.delete(Bolt.first)
user_posts.save

Je pense que la seule façon de le faire est de travailler avec les actions d'instance, de faire vos modifications sur cette instance et de la sauvegarder une fois que vous avez terminé.

C'est un peu différent de l'AR, mais ça devrait aller.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top