2009-11-29 4 views
3

Я есть эти два класса,DataMapper имеет п через ресурс DELETE (Удалить из ассоциации) не работает

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 

так, как только у меня есть новый пост как:

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

Я имеющие серьезные проблемы с добавлением и удалением из ассоциации, например:

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 

И как мне удалить сообщение из этой ассоциации? Я использую следующие, но, безусловно, ее не работает:

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 

Так что я действительно не знаю, как это удалить из массива BoltUser.

ответ

4

Метод delete() и другие методы из массива работают только в копии коллекций в памяти. Они ничего не изменяют, пока вы не сохраните объекты.

Кроме того, все действия CRUD, выполненные над коллекцией, в первую очередь влияют на цель. Некоторые, например create() или destroy(), будут добавлять/удалять промежуточные ресурсы во многих коллекциях, но это лишь побочный эффект создания или удаления цели.

В вашем случае, если вы хотите удалить только первый пост, вы можете сделать это:

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

User.first.posts.first(1) часть возвращает коллекцию области видимости только первый пост. Вызов уничтожения в коллекции удаляет все в коллекции (которая является только первой записью) и включает в себя посредников.

+0

Спасибо за объяснение Дэн, этот метод, о котором вы говорили, работал так же хорошо! Cheers – zanona

+0

Не создается() устарело? Но я понимаю, что new() теперь работает одинаково для коллекции, так что User.first.posts.new() создаст и сохранит запись? – arbales

+0

Нет, create() не устарел. new() просто инициализирует ресурс в памяти. Однако он связывает его с родительским объектом, поэтому сохранение родителя приведет к тому, что ребенок будет сохранен. – dkubb

0

мне удалось это сделать, выполнив:

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

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

Я думаю, что единственный способ сделать это, работая с действиями, например, сделать изменения на этом экземпляре и после того, как вы закончили, просто сохраните его.

Это своего рода отличие от AR, но все равно должно быть хорошо.

 Смежные вопросы

  • Нет связанных вопросов^_^