2016-06-11 64 views
0

我有一個Post模型has_many:authors和has_many:標籤通過:tag_posts,作者模型has_many:posts和has_many:標籤通過:posts,和標籤模型has_many:通過:tag_posts發佈。Rails 4.2中has_many的條件?

帖子必須通過審覈(存儲爲枚舉Post.status)才能在網站上可見。版主可以通過查找具有不同Post.status的帖子來查看未經審閱的帖子,但常規用戶永遠無法看到它們。

有沒有什麼辦法可以過濾所有這些關聯,以確保他們只返回主持人已批准的帖子?

例如:如果我現在調用Author#標籤,它會返回作者寫過的所有帖子上的所有標籤,但我只希望它返回作者寫過的批准的帖子上的標籤。說作者有兩篇文章,第一篇被批准並被標記爲「章魚」,第二篇尚未被批准並被標記爲「魷魚」:對該作者調用#標籤應僅返回章魚標籤,而不是魷魚標籤。

回答

0

我有HAS_MANY一個Post模型:即HAS_MANY帖子和標籤模式:通過帖子:tag_posts作者和的has_many:標籤通過:tag_posts,即HAS_MANY的作者模型:職位和的has_many:標籤通過。

首先,我們來整理一下這些關係。我相信這是你真正想要的:

class Post < ActiveRecord::Base 
    belongs_to :author # NOT has_many 
    has_and_belongs_to_many :tags # use an implicit join table 
end 

class Author < ActiveRecord::Base 
    has_many :posts 
end 

class Tag < ActiveRecord::Base 
    has_and_belongs_to_many :posts # use an implicit join table 
end 

有沒有什麼辦法可以過濾所有這些關聯,以確保它們只返回版主已批准的職位?

是的。沒有深入細節,關鍵技術是在Post模型上定義scope;是這樣的:

class Post < ActiveRecord::Base 
    scope :approved -> { where(status: Post.statuses['approved']) } 
end 

然後,您可以只顯示通過Post.approved批准的職位;或者通過Post.where(user: foo).approved僅爲特定用戶批准的帖子。

爲了顯示的標籤列表,然後你可以,例如,只是做:

Post.where(user: foo).approved.map(&:tags).uniq 

這隻會給你一個Array,不是ActiveRecord::Collection。但爲了您的目的,這可能夠好了。

+0

對,我應該更清楚 - 多位作者可以貢獻一篇文章。 posts-authors和posts-tags連接表現在都是明確的,以便稍後添加標籤排序,明顯的作者信用等。獲取ActiveRecord :: Collection將是理想的,因爲作者的視圖頁面應該鏈接到標籤;這可以通過自定義SQL完成,但我希望有一個更簡單的解決方案。 – anon

0

您可以自行確定範圍has_many。例如,

class Author 
    has_many :moderated_posts, -> { moderated }, class_name: 'Post' 
end 

class Post 
    scope :moderated, -> { where(status: approved_statuses) } 
end