문제

나는이 두 가지 수업을 가지고 있습니다.

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과 다르지만 괜찮을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top