【问题标题】:ActiveRecord query to fetch all posts that have a topic in common with this postActiveRecord 查询以获取与该帖子具有共同主题的所有帖子
【发布时间】:2012-01-29 03:56:05
【问题描述】:

我正在为寻找相关帖子的复杂查询绞尽脑汁:

这是我的模型:

class Post
   has_many :post_assignments, :dependent => :destroy
   has_many :topics, :through => :post_assignments
end

class PostAssignment
   belongs_to :post
   belongs_to :topic
end

class Topic
  has_many :post_assignments, :dependent => :destroy
  has_many :posts, :through => :post_assignments
end

鉴于我的帖子可能有也可能没有主题。我需要找到与此主题有共同主题的所有帖子。

我已经在使用 squeal gem,所以语法会更好。

【问题讨论】:

    标签: sql ruby-on-rails activerecord ruby-on-rails-3.1


    【解决方案1】:

    对不起,我没有使用 sequal gem,所以不知道它的语法。我认为这可行,但可能不是最好的方法:

    @post.topics.map(&:posts).flatten.uniq
    

    我能想到的另一种方式:

    Post.joins('LEFT OUTER JOIN post_assignments ON post_assignments.post_id = post.id LEFT OUTER JOIN topics on post_assignments.topic_id = topic.id').where(:topic_id => @post.topics.map(&:id)) 
    

    最后,您可以编写 SQL。

    【讨论】:

    • 它应该是.uniq 而不是.uniq!。 .uniq! 返回nil
    • 是的,这按预期工作。我想第一种方法有一些性能缺陷,因为它对每个单独的主题执行查询。第二种方法好像sql语法有错误。 AND LEFT OUTER JOIN 似乎无效。我永远无法让它正常工作。
    • 哦,对不起。 'AND' 是额外的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    相关资源
    最近更新 更多