2014-01-29 4 views
0
class Event < ActiveRecord::Base 
    has_many :meetings 
end 

class Meeting < ActiveRecord::Base 
    belongs_to :event 
end 

모든 이벤트를 검색하는 mysql 쿼리를 작성하는 방법 group_by 회의 DATE(start_at)?연관된 객체의 속성을 기준으로 그룹화

{"2014-01-24"=>[#<Event id: , title: "First", created_at: "2014-01-24 16:02:52", updated_at: "2014-01-24 16:02:52">, #<Event id: 2, title: "Second", created_at: "2014-01-24 16:02:52", updated_at: "2014-01-24 16:02:52">], "2013-01-29"=>[#<Event id: 3, title: "Third", created_at: "2013-01-29 05:30:40", updated_at: "2014-01-29 05:30:40">], ...]} 

PS : 결과

Event.inludes(:meetings).group ... 

가 나는 Hash을 얻으려면 내가 PostgreSQL

을 사용하고 지금은이 방법으로 그것을 얻을 :

hash = {} 
Meeting.where("extract(month from start_at) = ?", Date.today.month).pluck('DATE(start_at)').uniq.each do |date| 
    hash[date] = Event.includes(:meetings).where("DATE(meetings.start_at) = ?", date).references(:meetings) 
end 

그러나 데이터베이스에 많은 쿼리를 생성했습니다 : (

답변

1

Event.joins (: meetings) .group ('meetings.start_at')해야합니다. 하지만 당신이 원하는 것은 group_by 배열 방법 입니다. 그러면 무엇을해야합니까

@ events.group_by {| e | e.meeting.start_date}

많은 많은 경우 당신은

result = Hash.new 
Meeting.include(:events).each {|m| result[m.start_at]||=[]; result[m.start_at] << m.events} 

더 나을해야 하나 라이너 당신은

Meeting.includes(:events).inject(Hash.new) do |result, m| 
    result[m.start_at]||=[] 
    result[m.start_at] << w.events 
    result 
end 

이 코드는 두 개의 데이터베이스 호출을 실행해야 할 수 난 think

+0

이벤트 'has_many' meetings – zolter

+0

관련 이벤트 (: includes)로 모든 회의를 가져 와서 결과 = Hash.new; @ meetings.each {| m | 결과 [m.start_at] || = []; 결과 [m.start_at] << m.events} – sirfilip

+0

감사합니다! 너는 내 하루를 보냈다! – zolter

관련 문제