2012-05-30 88 views
7

在文檔它說,你可以使用inverse_of的權衡:無,但並不能真正說明用例: http://mongoid.org/en/mongoid/docs/relations.html#has_and_belongs_to_many什麼是使用mongoid的has_and_belongs_to_many與inverse_of

我假設它是在的情況下有用一個對象會有很多其他對象,所以你可以完全用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 

只是想檢查我的想法。

回答

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 
+0

好的真棒,現在它更有意義,他們單方面意味着什麼 - 你不會在另一邊設置habtm。謝謝@rubish我真的很感激它! –

+0

只是爲了跟進......你知道是否有一種簡單的方法來獲取'Tag'端的訪問器方法設置。我開始定義自己的'def posts','def posts ='等等,但是我意識到有更多像''','push'和after postbacks被post銷燬等等。更簡單的方法。謝謝! –

+0

@BrianArmstrong對不起,但我不知道一個簡單的出路。雖然你可以嘗試mongoid郵件列表。 – rubish

相關問題