DataMapperのResource DELETE(関連付けから削除)を通じてnが機能しない
-
07-07-2019 - |
質問
この2つのクラスがあります
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配列から削除する方法が本当にわかりません。
解決
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