내 모델은이 사건에 대한 통화에 참여할 수 :가장 효율적인 레일
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
으로 당신에게 현재 사용자의 투표 값을 줄 것이다 :