首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >has_many上的自定义范围,:通过关联(Rails 4)

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

Stack Overflow用户
提问于 2014-05-17 22:25:46
回答 2查看 8.8K关注 0票数 13

上下文

在我的设置中,用户通过CommunityUser拥有许多社区,社区通过CommunityPost拥有许多帖子。如果是这样的话,那么用户就会通过Communities拥有许多帖子。

User.rb

代码语言:javascript
复制
has_many :community_users
has_many :communities, through: :community_users
has_many :posts, through: :communities

考虑到上面的User.rb,调用"current_user.posts“会返回与current_user相同的一个或多个社区的帖子。

问题:

我希望改进这个关联,以便调用"current_user.posts“只返回那些社区是当前_user社区的完整子集的帖子。

因此,给定current_user的community_ids为1, 2,3,调用"current_user.posts“只会产生"community_ids”数组为1、2、3、1、2、2、3或1,2,3的帖子。

我一直在研究范围这里,但似乎无法确定如何成功地完成这一任务.

EN

回答 2

Stack Overflow用户

发布于 2014-05-18 08:19:52

问得好..。

我的切身想法:

--

ActiveRecord关联扩展

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

代码语言:javascript
复制
#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

--

条件联想

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

代码语言:javascript
复制
#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

--

来源

我原本以为这是你最好的选择,但更深入地看,我认为只有当你想使用不同的关联名称时,才会这样做。

指定has_many : the查询使用的源关联名称。只有在不能从关联推断名称时才使用它。has_many :订阅者,通过::订阅将查找:订户或订阅的订阅者,除非给出了:source。

老实说,这是一个需要思考的问题。

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

期待着进一步帮助您!

票数 12
EN

Stack Overflow用户

发布于 2014-05-24 04:29:19

您没有显示用于CommunityCommunityPost的模型和关系定义,因此确保在Community模型上有has_many :community_postshas_many :posts, through: :community_posts,在CommunityPost上有belongs_to :communitybelongs_to :post。如果您不需要跟踪ComunityPost上的任何内容,您只需使用Community上的has_and_belongs_to_many :posts和仅包含community_idpost_id外键的联接表communities_posts

假设您已经设置了我所描述的关系,那么您应该能够使用current_user.posts来获取一个可以进一步链接的关系,当您在它上调用.all时,它会返回与用户关联的所有社区的所有帖子。定义您的Post模型的任何类方法(例如范围方法)也可以从该关系中调用,因此,除非这些精化涉及到CommunityCommunityPost,否则您应该将它们放在CommunityCommunityPost模型上。实际上,很少需要对作用域进行AR关系扩展,因为通常您也希望能够独立于您可能使用的任何相关模型来改进模型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23716674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档