2009-11-20 2 views
1

나는 레일스에서 ​​처음이므로 쉽게 사용할 수 있습니다. 나는 블로그를 만들었고 사용자가 특정 게시물을 '좋아할'수 있음을 나타낼 수있는 기능을 만들었습니다. 내가 구현하는 방식은 게시 테이블과 별도의 테이블 '투표'를 사용하는 것입니다. 사용자가 "like"버튼을 클릭하면 레코드는 '1'값과 특정 게시 ID가있는 'vote'테이블로 전송됩니다.별도의 표에 "투표"레코드 수로 게시물을 표시

"가장 좋아하는"게시물을 사이드 바에 표시하고 싶습니다. 그런 일을 부르는 법에 어떻게 가야합니까? 나는 post_title과 'votes'의 수를 표시하고 싶습니다. 즉, 어떻게 든 가장 많은 레코드를 갖고 내림차순으로 표시하는 post_id에 대해 'vote'테이블을 쿼리하고 싶습니다.

나는 이것이 쉬운 질문이되기를 바랍니다.

+0

득표표에 투표 당 1 개의 기록이 있거나 총 투표 수와 함께 게시물 당 하나의 기록이 있습니까? – mikej

답변

2

이 작업을 수행하는 방법은 여러 가지가 있지만 아마도 가장 다양하고 레일 틱은 순위를 할 수있는 방법으로 모듈을 만들 수 다음 "좋아 할 수있는 클래스 나 연관됩니다 "그 모듈을 확장하십시오.

# lib/likable.rb 
# 
module Likable 
    def most_liked (limit = 10) 
    # This may be possible without a find_by_sql... see the API docs. 
    find_by_sql("SELECT Posts.*, SUM(votes.count) AS num_votes FROM Posts, Votes WHERE Posts.id = post_id GROUP BY post_id ORDER BY num_votes DESC LIMIT #{limit}") 
    end 
end 

# app/models/post.rb 
# 
require 'likable' 

class Post < ActiveRecord::Base 
    extend Likable 
    # ...whatever else you've got in here 
end 

# app/models/user.rb (or any other model with things that can be "liked") 
# 
require 'likable' 

class User < ActiveRecord::Base 
    has_many :posts, :extend => Likable 
    # ...the rest of the User class 
end 

이것은 당신이 같은 일을 할 수 있습니다 ...

Post.most_liked     # => an array of the 10 most liked posts 
@some_user.posts.most_liked(5) # => that user's 5 most liked posts 

은 나중에, 특정 포스트 얼마나 많은 표를, 예를 볼 수있는 모듈에 메소드를 추가 할 수 필요합니다. post_idVote에 으로 변경하고 다형성 연관성을 부여한 다음 Likable 모듈을 사용하여 게시물뿐만 아니라 무엇이든 투표 할 수 있습니다 (전화를 일반화해야 most_liked에서 찾게됩니다.).

2

실제로 이것은 게시 캐시에 카운터 캐시를 추가하여 모든로드에서 데이터베이스 수를 피하는 것이 가장 좋습니다.

railscast episode은 카운터 캐시를 설정하는 방법을 설명합니다.

카운터 캐시의 이름을 votes_count로하면 컨트롤러에서 가장 많이 사용되는 10 개의 게시물을 얻을 수 있습니다.

@popular_posts = Post.find(:all, :limit => 10, :order => "votes_count DESC") 
관련 문제