has_many上的自定义范围,:通过关联(Rails 4)

时间:2014-05-17 22:25:46

标签: ruby-on-rails ruby-on-rails-3 activerecord scope associations

背景

在我的设置中,用户通过CommunityUser拥有多个社区,社区通过CommunityPost拥有许多帖子。如果遵循,则用户通过社区拥有许多帖子。

User.rb

has_many :community_users
has_many :communities, through: :community_users
has_many :posts, through: :communities

鉴于上述User.rb,Calling" current_user.posts"返回与current_user共同拥有一个或多个社区的帖子。

问题:

我希望改进这种关联,以便调用" current_user.posts"仅返回其社区是current_user社区的完整子集的帖子。

因此,给定一个current_user为[1,2,3]的current_user,调用" current_user.posts"只会产生那些" community_ids"数组是1,[2],[3],[1,2],[1,3],[2,3]或[1,2,3]。

我一直在研究范围here,但似乎无法确定如何成功实现这一目标......

2 个答案:

答案 0 :(得分:11)

好问题......

我的直接想法:

-

ActiveRecord Association Extension

这些基本上允许您为关联创建一系列方法,允许您确定特定条件,如下所示:

#app/models/user.rb
has_many :communities, through: :community_users
has_many :posts, through: :communities do
   def in_community
       where("community_ids IN (?)", user.community_ids)
   end
end

-

Conditional Association

您可以在关联中使用条件,如下所示:

#app/models/user.rb
has_many :posts, -> { where("id IN (?)", user.community_ids) }, through: :communities #-> I believe the model object (I.E user) is available in the association

-

Source

我原本以为这是你最好的选择,但更深入地看待它,我认为只有你想使用不同的联想名称

  

指定has_many:through使用的源关联名称   查询。只有在无法从中推断出名称时才使用它   协会。 has_many:订阅者,通过::订阅将会看起来   对于:订阅者或订阅者订阅者,除非a   :来源。


说实话,这是需要一些思考的问题之一

首先,您如何存储/调用community_ids数组?它是直接存储在数据库中,还是通过ActiveRecord方法Model.association_ids访问?

期待为您提供进一步的帮助!

答案 1 :(得分:0)

您不会显示CommunityCommunityPost的模型和关系定义,因此请确保has_many :community_postshas_many :posts, through: :community_posts位于Community上1}}模型以及belongs_to :community上的belongs_to :postCommunityPost。如果您不需要跟踪ComunityPost上的任何内容,则可以使用has_and_belongs_to_many :posts上的Community和仅包含外键{{1}的联接表communities_posts }和community_id

假设您按照我的描述设置了关系,您应该能够使用post_id来获得可以进一步链接的关系,并且当您致电时,该关系将返回用户与之关联的所有社区的所有帖子{1}}就可以了。定义你的Post模型的任何类方法(例如范围方法)也可以从该关系中调用,因此除非这些改进属于current_user.posts.all,否则你应该放置你的改进,在这种情况下你会将它们分别放在CommunityCommunityPost模型上。实际上很少需要对范围进行AR关系扩展,因为通常您还希望能够独立于您可能用于获取它的任何相关模型来优化模型。