質問

この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とは少し異なりますが、問題ないはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top