activerecord属性基于连接?

时间:2013-05-25 23:10:44

标签: ruby-on-rails activerecord

我正在构建一种reddit克隆来再次获取rails。我有一张表posts和一张表votes

文章:

create_table :posts do |t|
  t.belongs_to :user
  t.string :title
end

投票:

create_table :votes do |t|
  t.belongs_to :post
  t.belongs_to :user
  t.string :sort_of_vote
end

我想检索一个帖子列表,如果用户喜欢它,每个帖子都有一个布尔属性。

所以我想要像:

Post.all.first.liked?

我正在考虑一个很好的方法来做到这一点。我不想要的:每个喜欢的查询?方法调用。什么是实现这一目标的好方法?

2 个答案:

答案 0 :(得分:0)

了解 Eager Loading Associations ,特别是关于使用 includes 解决N + 1查询问题的部分

@posts = Post.includes(:votes)

现在,您可以在Post上创建一个类似

的方法
def liked?
  !votes.empty?
end

并在不强制查询集合中的每个项目的情况下调用它。

答案 1 :(得分:0)

这是你想要的吗?

class User
  def liked_posts
    @liked_posts ||= self.votes.posts
  end
  def likes?(post)
    @liked_posts.include?(post)
  end
end

class Post
  def liked?(user)
    user.liked_posts.include?(self)
  end
end

这应该检索一次喜欢的帖子列表并缓存它。然后当你调用post.liked?(user)或user.likes?(post)时,它将能够使用缓存的数据来确定用户是否喜欢该帖子。