Ruby on rails 如何在活动记录中从关系到关联模型的关系

Ruby on rails 如何在活动记录中从关系到关联模型的关系,ruby-on-rails,ruby,rails-activerecord,Ruby On Rails,Ruby,Rails Activerecord,我经常遇到这种情况 class Post has_many :comments end 现在,如果我有一个帖子的关系,我将如何得到所有评论的关系 我要找的是 Post.where(user: user).comments 但这行不通。我是不是漏掉了什么明显的东西?这似乎是一个常见的用例 基本上,当你做Post.where(user:user).includes(:comments)我们已经预加载了所有必需的评论,我想要的是直接访问它们,而不需要Post.where(user:user

我经常遇到这种情况

class Post
   has_many :comments

end
现在,如果我有一个帖子的关系,我将如何得到所有评论的关系

我要找的是

Post.where(user: user).comments
但这行不通。我是不是漏掉了什么明显的东西?这似乎是一个常见的用例

基本上,当你做
Post.where(user:user).includes(:comments)
我们已经预加载了所有必需的评论,我想要的是直接访问它们,而不需要
Post.where(user:user).includes(:comments).map{p | p.comments}.flatte.uniq
或类似的东西

我要定义一个范围

scope:comments\u in_user_posts,->(user){where(user:user).包括(:comments).map{p{p.comments}.flatten}

然后像
Post.comments\u in\u user\u posts(user)
一样使用它

编辑:


另一个选项是使用
Comment.where(post:post.where(user:user))
您还可以在
post
模型静态方法中创建:

def self.user_comments(user)
    Comment.where(post: Post.where(user: user))
end
然后打电话:

Post.user_comments(user)

如果要获取
comment
对象,请在
comment
类中实现逻辑

您可以按如下方式定义范围:

class Comment < ActiveRecord::Base
  belongs_to :post

  scope :from_user, ->(user_id) { joins(post: :user).where(users: {id: user_id} }
end

您需要在评论模型中提到,属于:post

    class Comment < ActiveRecord::Base
      belongs_to :post  
    end
您可以尝试在rails控制台中检查这些内容。现在,当您看到注释对象时。它应该有post_id。 所以现在

发表评论


给出注释数组和
注释。post
将给出相关的post。

这并不是真正添加任何额外内容。。只是abt代码组织。。没有修复程序吗?可能类似于
注释.where(post:post.where(user:user))
?我不认为有一种方法可以不深入ActiveRecord就完全做你想做的事情。。你的第二个选择可能是最好的选择。。。让我等一会儿,看看有没有人来。你能把这个加在你的答案上吗?那是在破坏链接能力。现在你不能在用户帖子(user)中写
Post.comments\u,除非你在文章的最后写
comments\u,在用户帖子(user)
。。。但是如果你定义了另一个这样的方法,那么你永远不能同时使用这两种方法。接受编辑,因为我相信这是第一个想到的。我现在不能测试这个,但是Post.where(user:user.map(&:comments)呢@Nimir这基本上就是我正在用一些语法糖做的事情,它看起来像我正在寻找的东西不存在。。这对我来说很奇怪。我不是在一个post对象上操作,而是在一个任意关系上操作,该关系可以计算为任意数量的post对象。此方法似乎最简单,但不是我所希望的。非常有趣的语法,但与其他解决方案类似。嗯,这只会命中数据库一次,不像
Comment.where(post:post.where(user:user))
进行两次查询…但就获得结果而言,是的,两者都是相同的。您确定它进行了两次查询吗?看起来可能是这样,但我相信它总体上进行了1次查询,其中包含一个隐式连接(选择中的位置)请查看您的日志以确定。无论如何,rails 4.1中不推荐使用隐式联接,因此您不应该使用与联盟关系稍有不同的Mi verified,因为它有许多匹配。
Match.where(联盟:league.all)
give
SELECT
matches
*FROM
matches`WHERE
matches
leagues\u id
IN(SELECT
leagues
id
FROM
leagues
)`4.1.5
    class Comment < ActiveRecord::Base
      belongs_to :post  
    end
            @post.comments.create(name: "New comment")