我正在构建一种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?
我正在考虑一个很好的方法来做到这一点。我不想要的:每个喜欢的查询?方法调用。什么是实现这一目标的好方法?
答案 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)时,它将能够使用缓存的数据来确定用户是否喜欢该帖子。