几个协会为一体

时间:2013-05-15 16:40:08

标签: ruby-on-rails associations

我如何获得相同的结果,但是像帖子方法是一个简单的关联? 我想这样做:“user.posts.active”。是定义的最佳解决方案:finder_sql?

class User < ActiveRecord::Base
    has_many :created_posts, class_name: Post.name, foreign_key: :creator_id
    has_many :updated_posts, class_name: Post.name, foreign_key: :updater_id

    def posts
        (created_posts + updated_posts).flatten.uniq
    end
end

1 个答案:

答案 0 :(得分:3)

不是加载两组帖子然后在Ruby中统一它们,你可以通过让SQL只给你一个唯一的列表来提高效率。

class User < ActiveRecord::Base
  def posts
    Post.where(["creator_id = ? OR updater_id = ?", self.id, self.id])
  end

  ...
end

这更有效的原因是因为它使用一组响应行发出单个数据库查询,重复项永远不会返回,然后ActiveRecord只为该组行实例化Ruby对象。

通过比较,原始问题中的方法发出两个数据库查询,每个查询创建一个User对象数组,然后组合这两个数组,然后删除重复项。额外的对象初始化,然后是数组的组合,然后组合数组的迭代需要删除重复 - 所有组合在一起 - 是大部分开销发生的地方。

与此类的所有优化一样,如果您处理的是非常小的数据集,那么性能差异可能会微不足道,但是在这种情况下,单个查询,单一响应方法只是简单明了。

旁注......

如果定义了关系,如果两个用户一个接一个地更新同一个帖子,那么不仅最近的用户将其ID分配给updater_id吗?这是你想要的吗?

根据应用程序的设计,最好自行记录更新,以便编辑指定帖子的所有用户都会在updated_posts列表中包含该帖子。