DataMapper는 Resource DELETE(연관에서 제거)를 통해 n이 작동하지 않습니다.
-
07-07-2019 - |
문제
나는이 두 가지 수업을 가지고 있습니다.
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 Array에서 이것을 삭제하는 방법을 정말로 모르겠습니다.
해결책
delete() 메서드와 Array의 다른 메서드는 컬렉션의 메모리 내 복사본에서만 작동합니다.객체를 유지할 때까지 실제로 아무것도 수정하지 않습니다.
또한 컬렉션에서 수행되는 모든 CRUD 작업은 주로 대상에 영향을 미칩니다.create() 또는 destroy()와 같은 일부는 다대다 컬렉션에서 중간 리소스를 추가/제거하지만 이는 대상을 생성하거나 제거하는 부작용일 뿐입니다.
귀하의 경우 첫 번째 게시물만 제거하려면 다음과 같이 하면 됩니다.
User.first.posts.first(1).destroy
그만큼 User.first.posts.first(1)
부분은 첫 번째 게시물로만 범위가 지정된 컬렉션을 반환합니다.컬렉션에 대해 destroy를 호출하면 컬렉션의 모든 항목(첫 번째 레코드)이 제거되고 중개자를 포함합니다.
다른 팁
나는 다음을 통해 그것을했다 :
#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과 다르지만 괜찮을 것입니다.
제휴하지 않습니다 StackOverflow