Pergunta

Estou têm essa duas 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

Assim, uma vez que tenho um novo post como:

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

Estou tendo problemas graves para adicionar e remover a partir da associação, como:

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 como devo remover uma mensagem de que a associação? Eu estou usando o seguinte, mas definitivamente não o seu trabalho:

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

Então, eu realmente não sei como excluir isso da matriz BoltUser.

Foi útil?

Solução

O método delete (), e outros métodos de matriz única obra na cópia em memória das coleções. Eles realmente não modificar nada até que você persistir os objetos.

Além disso, todas as ações CRUD executadas em uma coleção afetam principalmente o alvo. Alguns, como criar () ou destroy (), irá adicionar / remover os recursos intermediários em muitos a muitas coleções, mas é apenas um efeito colateral de criar ou remover o alvo.

No seu caso, se você quisesse remover apenas o primeiro post, você poderia fazer isso:

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

A parte User.first.posts.first(1) retorna uma coleção como escopo apenas o primeiro post. Chamando destruir na coleção remove tudo na coleção (que é apenas o primeiro registro) e inclui os intermediários.

Outras dicas

Eu consegui fazê-lo fazendo:

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

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

Eu acho que a única maneira de fazer isso é através do trabalho com as ações de instância, fazer as alterações nessa instância e depois que você terminar, basta salvá-lo.

É meio diferente de AR, mas ele deve estar bem apesar de tudo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top