1

저는 레일과 SQL에 비교적 익숙합니다. 프로덕션 환경에서 포스트그레스를 사용하고 있습니다. 레코드 그룹의 합계를 구하는 방법?

가 나는 Like 모델을 가지고 다형성 (polymorphism)을 통해,이 속성 likeable_typelikeable_id을 가지고,이 내 Photo 모델의 항목은 사용자가 "좋아"하는 방법입니다. 좋아하는 대상이 Photo 인 경우 likeable_type, 사진의 ID가 likeable_id 인 경우 같은 대상을 통해 사진에 액세스 할 수 있습니다. like.likeable

내 질문 : 가장 좋아하는 사진이 맨 위에 있고 가장 적게는 순서의 맨 아래에있는 사진 목록을 얻을 수 있기를 바랍니다. 어떻게해야합니까?

은 지금까지 나는 내 코드

likes = Like.find(:all, :conditions => { :created_at => 1.days.ago.utc...Time.now.utc, :likeable_type => "Photo" }) 
likes = likes.group(--- something here --- , SUM(--- something here ---)) 

처럼 보일 것이다 알고 있지만 나는 올바른 구문이 될 shoule 무엇인지 파악하는 것은 매우 수 없습니다입니다.

도움이 될 것입니다.

+0

, 내가 뭘하고 싶은지는 지난 24 시간 동안 같은 테이블에 얼마나 많은 각각의 likable_id가 만들어 졌는지를 세는 것입니다. 누구든지 도와 줄 수 있습니까? – alik

+0

힌트도 도움이 될 것입니다. 정말 이걸 알아낼 필요가 있니? 아무도 도와 줄 수 있니? – alik

답변

0

Like.where(created_at: (1.days.ago.utc...Time.now), linkable_type: 'Photo').first.likes.sum(:something)과 같은 형식 일 수도 있습니다. 모델을 올바르게 이해한다면?

+0

이것이 올바른 구문이라고 생각하지 않습니다. 그것은 작동하지 않았다 – alik

+0

나는 .first.likes가 잘 맞지 않는다고 생각한다. – alik

0

여기에 하나의 가능성이다 :

Like.where('created_at >= ?',Time.now - 1.day).where('likeable_type = ?','Photo').group('likeable_id').order('count_all DESC').count 

이 (MySQL의)과 같은 SQL 생성합니다 : 당신이 {photo_id => 좋아하는 ActiveSupport :: OrderedHash를 얻을 수 있습니다

SELECT COUNT(*) AS count_all, 
     likeable_id AS likeable_id 
FROM `likes` 
WHERE (created_at >= '2011-11-24 20:43:19') 
     AND (likeable_type = 'Photo') 
GROUP BY likeable_id 
ORDER BY count_all DESC 

과 , photos_id_2 => 좋아요.}

다형성이 아니고 Like가 "belongs_to : photo"인 경우 .group (: photo)을 수행하고 실제로 레일이 {photo_object => 좋아요. s} -하지만 다형성 연관을 사용하면 내 지식에 .group (: 호감)을 수행 할 수 없으므로 해시를 반복하고 Photo.find (photo_id_from_hash)를 실행해야합니다. 그 사진은 좋아하는 사진 수에 따라 효율적이기 때문에 이드 목록으로 놀아야 만 할 수도 있습니다.하지만 적어도 위의 내용은 많은 노력 없이도 목록을 얻을 수 있습니다.

2

가정하면 다음과 같습니다

class Photo < AR::Base 
    has_many :likes, :as => :likeable 
end 


class Like < AR::Base 
    belongs_to :likeable, :polymorphic => true 
end 

시도 :

@photos = Photo.select("photos.*, count(likes.id) AS likes_count").joins(:likes).where('likes.created_at > ?', 1.day.ago).group('photos.id').order('likes_count DESC') 

이것은 또한 당신이 좋아하는 수를 액세스 할 수 있도록 각 사진이있다 : 즉

@photo.first[:likes_count] # => 4 
관련 문제