7

ドキュメントでは、 inverse_of: nil を使用できると書かれていますが、ユースケースについては実際には説明していません: http://mongoid.org/en/mongoid/docs/relations.html#has_and_belongs_to_many

あるオブジェクトに他のオブジェクトがたくさんある場合に役立つと思いますので、 inverse_of nil でその側を完全にスキップして、ストレージスペースを節約できますか?

たとえば、次のようになります。

class Post
  has_and_belongs_to_many :tags
end

class Tag
  has_and_belongs_to_many :posts, inverse_of: nil
end

タグは数百または数千の投稿に属している可能性がありますが、投稿にはおそらく 5 つ程度のタグしかありません。

それで、これはそれの良いユースケースですか?まだできると思います

tag.posts

などは通常と同じですが、主なトレードオフは、クエリを次のように変更することです。

Post.find(tag.post_ids)

の中へ

Post.where(tag_ids: tag.id)

tag_ids にインデックスがある場合でも、かなり高速であるように思われます。だから多分最高は次のようなものです:

class Post
  has_and_belongs_to_many :tags, index: true
end

class Tag
  has_and_belongs_to_many :posts, inverse_of: nil
end

自分の考えを確認したいだけです。

4

1 に答える 1

7

あなたは確かにユースケースを正しく理解していますが、例は作り直されているようです。モデルは次のようになります。

class Post
  has_and_belongs_to_many :tags, inverse_of: nil, index: true
end

class Tag
  # you don't want this side as a tag can be related to 1000s of posts
end

投稿からの関連付けを使用できますが、タグについては自分でクエリを作成する必要があります。

post.tags                    # get tags for a post
Post.where(tag_ids: tag.id)  # find posts for a tag
于 2012-05-30T07:27:49.117 に答える