1

我正在构建一种 reddit 克隆来再次拿起铁轨。我有一张桌子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?

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

4

2 回答 2

0

阅读有关Eager Loading Associations的信息,特别是关于解决 N + 1 个查询问题的部分,它使用includes

@posts = Post.includes(:votes)

Post现在您可以在like上创建一个方法

def liked?
  !votes.empty?
end

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

于 2013-05-25T23:41:20.063 回答
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) 时,它将能够使用缓存的数据来确定用户是否喜欢该帖子。

于 2013-05-25T23:42:10.633 回答