DataMapper non ha funzionato tramite ELIMINA risorse (Rimuovi dall'associazione)
-
07-07-2019 - |
Domanda
Ho queste due lezioni,
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
Quindi una volta ho un nuovo post come:
Post.new(:title => "Hello World", :body = "Hi there").save
Ho gravi problemi da aggiungere e rimuovere dall'associazione, come:
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
E come devo rimuovere un post da quell'associazione? Sto usando il seguente ma sicuramente non funziona:
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
Quindi non so davvero come eliminarlo dall'array BoltUser.
Soluzione
Il metodo delete () e altri metodi dell'Array funzionano solo sulla copia in memoria delle Collezioni. In realtà non modificano nulla finché non si persistono gli oggetti.
Inoltre, tutte le azioni CRUD eseguite su una raccolta influiscono principalmente sulla destinazione. Alcuni, come create () o destroy (), aggiungeranno / rimuoveranno le risorse intermedie in molte o molte raccolte, ma è solo un effetto collaterale della creazione o della rimozione del target.
Nel tuo caso, se volessi rimuovere solo il primo Post, puoi farlo:
User.first.posts.first(1).destroy
La parte User.first.posts.first (1)
restituisce una raccolta con ambito solo al primo post. La chiamata a distruggere nella raccolta rimuove tutto nella raccolta (che è solo il primo record) e include gli intermediari.
Altri suggerimenti
Sono riuscito a farlo facendo:
#to add
user_posts = User.first.posts
user_posts << Bolt.first
user_posts.save
#to remove
user_posts.delete(Bolt.first)
user_posts.save
Penso che l'unico modo per farlo sia quello di lavorare con le azioni dell'istanza, fare le tue modifiche su quell'istanza e dopo averlo finito, salvalo.
È un po 'diverso dall'AR, ma dovrebbe andare bene però.