Frage

Ich bin diese zwei Klassen,

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

Also, wenn ich einen neuen Beitrag wie:

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

Ich habe ernsthafte Probleme aus der Zuordnung hinzuzufügen und zu entfernen, wie:

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

Und wie soll ich einen Beitrag aus diesem Verband entfernen? Ich bin mit der folgenden, aber auf jeden Fall seine nicht funktioniert:

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

So weiß ich wirklich nicht, wie dies löschen aus dem BoltUser Array.

War es hilfreich?

Lösung

Die Methode delete () und andere Methoden von Array arbeiten nur auf die im Speicher befindlichen Kopie der Sammlungen. Sie haben nicht wirklich etwas ändern, bis Sie die Objekte bestehen bleiben.

Auch alle CRUD Aktionen auf einer Sammlung durchgeführt in erster Linie das Ziel beeinflussen. Einige, wie create () oder zerstören (), werden die Vermittler Ressourcen in vielen zu vielen Sammlungen hinzufügen / entfernen, aber es ist nur ein Nebeneffekt der Schaffung oder das Ziel zu entfernen.

In Ihrem Fall, wenn Sie nur die erste Post entfernen wollten, könnten Sie dies tun:

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

Der User.first.posts.first(1) Teil gibt eine Sammlung nur den ersten Beitrag scoped. Der Aufruf auf der Sammlung zerstört alles, was in der Sammlung entfernt (die nur der erste Datensatz ist) und beinhaltet die Vermittler.

Andere Tipps

ich es geschafft, es zu tun, indem Sie:

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

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

Ich denke, der einzige Weg, es zu tun ist, indem sie mit der Instanz Aktionen arbeiten, machen Sie Ihre Änderungen an diesem Beispiel und nachdem Sie fertig, nur um es zu speichern.

Es ist irgendwie anders AR, aber es sollte jedoch in Ordnung sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top