2013-10-15 6 views
1

내 모델은이 사건에 대한 통화에 참여할 수 :가장 효율적인 레일

class Link < ActiveRecord::Base 
    has_many :votes 
    belongs_to :user 
end 

class Vote < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :link 
end 

class User < ActiveRecord::Base 

    has_secure_password 

    has_many :links 
    has_many :votes 
end 

나는 시스템의 모든 링크를 나열하는 페이지를 가지고있다. 각 링크마다 모든 투표의 현재 합계와 요청을 작성한 사용자가 해당 특정 링크에 투표했는지 (그리고 그렇다면 해당 투표 값이 무엇인지) 표시하고 싶습니다. 나는 이것을 가장 효율적인 방법으로하고 싶다.

현재 내 링크 컨트롤러에서 I이이 투표의 링크와 금액을 반환하기 위해 : 잘 작동하고 나에게 하나의 호출 내 모든 정보를 제공합니다

def index 
    @links = Link.all(:joins => :votes, :select => "links.*, sum(votes.value) as votes_total", :group => "links.id") 
end 

합니다. 그래서 내 질문은, 내가 current_user에 대한 투표 (존재하는 경우)를 반환하는 두 번째 쿼리를 만들 필요가 또는 어떻게 든 내 첫 번째 쿼리에 통합 할 수 있습니까?

또한 데이터베이스에서 sum_caching을 설정해야하지만 그 중 가장 좋은 방법은 아닙니다. 이견있는 사람?

@links = Link. 
    joins(:votes). 
    select(
    "links.*, sum(votes.value) as votes_total, sum(case votes.user_id when #{current_user.id} then votes.value else 0 end) as current_vote", 
    :group => "links.id" 
) 

@links.first.current_vote으로 당신에게 현재 사용자의 투표 값을 줄 것이다 :

답변

0

은 당신이 뭔가를 할 수 있습니다. 물론 시스템에 0의 값을 가진 투표가있는 경우 "현재 사용자가이 링크에서 0으로 투표했습니다"와 "현재 사용자가이 링크에 투표하지 않았습니다"를 구별하지 않습니다. 그걸 처리하기 위해 또 다른 선택된 값 (sum(case votes.user_id when #{current_user.id} then 1 else 0 end) as current_vote_exists)을 추가 할 수 있습니다.

자연스럽게, 이런 식으로 SQL에 삽입하거나 ActiveRecord와 함께 제공되는 SQL- 살균 툴을 검색 할 때 정말 조심해야합니다.

관련 문제