DataMapper tem n através Resource APAGAR (Remover de associação) não funciona
-
07-07-2019 - |
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.
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.