2013-05-25 57 views
1

我正在构建一种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?

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

回答

0

阅读有关Eager Loading Associations,具体上解N + 1次的查询问题的部分,其使用includes

@posts = Post.includes(:votes) 

现在可以创建上Post的方法等

def liked? 
    !votes.empty? 
end 

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

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)时,它将能够使用缓存的数据来确定用户是否喜欢该帖子。

+0

我*想*他正在寻找每个实例上带有标记的帖子集合,以了解它是否已被1个用户所喜欢。 – deefour

+0

@Deefour如果是这样的话,那么你的答案比我的好得多。如果用户喜欢它,我认为他希望在帖子旁边打上复选标记。 –

+0

对不起,我没有完全清楚:(我正在寻找标记upvote箭头为“已检查”,当用户喜欢它,所以我认为这个答案更多的是我正在寻找。我想知道是否有更多的rails-y方法可以做到这一点 – Leon