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.

È stato utile?

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ò.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top