基于连接的activerecord属性?
问题描述:
我正在构建一种reddit克隆来再次拿起导轨。我有一个表posts
和一个表votes
。基于连接的activerecord属性?
帖子:
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?
我在想一个好办法做到这一点。我不想要的:每个喜欢的查询?方法调用。什么是实现这一目标的好方法?
答
阅读有关Eager Loading Associations,具体上解N + 1次的查询问题的部分,其使用includes
@posts = Post.includes(:votes)
现在可以创建上Post
的方法等
def liked?
!votes.empty?
end
并在不强制收集每个项目的查询的情况下调用它灰。
答
这是你想要的吗?
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)时,它将能够使用缓存的数据来确定用户是否喜欢该帖子。
我*想*他正在寻找每个实例上带有标记的帖子集合,以了解它是否已被1个用户所喜欢。 – deefour
@Deefour如果是这样的话,那么你的答案比我的好得多。如果用户喜欢它,我认为他希望在帖子旁边打上复选标记。 –
对不起,我没有完全清楚:(我正在寻找标记upvote箭头为“已检查”,当用户喜欢它,所以我认为这个答案更多的是我正在寻找。我想知道是否有更多的rails-y方法可以做到这一点 – Leon