DataMapper ديه ن من خلال حذف الموارد (إزالة من الجمعيات) لا يعمل

StackOverflow https://stackoverflow.com/questions/1815686

سؤال

وأنا لديك هذه فئتين،

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.

هل كانت مفيدة؟

المحلول

وهذه الطريقة () الحذف، وأساليب أخرى من صفيف تعمل فقط على نسخة في الذاكرة من المجموعات. انهم في الواقع لا تعديل أي شيء حتى كنت لا تزال قائمة الكائنات.

وأيضا، وجميع الإجراءات CRUD أجريت على مجموعة يؤثر في المقام الأول الهدف. وهناك عدد قليل، مثل إنشاء () أو تدمير ()، وإضافة / إزالة الموارد الوساطة في العديد من العديد من المجموعات، ولكن هذا فقط من الآثار الجانبية لإنشاء أو إزالة الهدف.

في الحالة الخاصة بك، إذا أردت إزالة فقط أول بوست، هل يمكن أن تفعل هذا:

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

والجزء User.first.posts.first(1) بإرجاع مجموعة خاصة بتطبيق فقط لأول وظيفة. داعيا تدمير على جمع يزيل كل شيء في جمع (والذي هو مجرد السجل الأول) ويشمل وسطاء.

نصائح أخرى

وتمكنت من القيام بذلك عن طريق القيام:

#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