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

class Meeting < ActiveRecord::Base 
    belongs_to :event 
end 

如何寫入mysql查詢來搜索所有事件group_by會議DATE(start_at)按屬性分組關聯對象

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

因此,我希望得到一個Hash

{"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:我使用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數組方法http://apidock.com/ruby/Enumerable/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 

此代碼應執行兩個數據庫調用我認爲

+0

事件'has_many'會議 – zolter

+0

那麼在這種情況下,如果您獲取與相關事件(:includes)的所有會議,然後執行 result = Hash.new; @ meetings.each {| M |導致[m.start_at] || = [];結果[m.start_at] << m.events} – sirfilip

+0

謝謝!你讓我今天一整天都感覺很好! – zolter