2016-02-04 50 views
0

我有活動,有日期和名字,那的has_many分鐘ActiveRecord的查詢在給定列獨特的,給予一定的順序

我需要找出所有按日期的第一個事件有名字,然後收集與這些事件相關的所有分鐘。

Event.order(date: :asc).uniq_by(&:name).map(&:minutes).flatten 

差不多工作。除了我最終得到了一個數組,而不是一個ActiveRecord :: Relation,並且我真的很想從Minute開始,並將其作爲一個範圍,例如... Minute.first_time_events()給我所有來自事件的分鐘這是迄今爲止的第一個以他們的名字命名的活動。

最後一個警告,我使用rails 3.2。謝謝

回答

0

我會拉動ids的事件,然後在一個範圍內使用它來獲取分鐘。

ids = Event.uniq(:name).order(date: :asc).ids 
minutes = Minute.joins(:event).where(events: { id: ids }) 

這裏需要說明的是,這是我會怎麼做它的Rails 4.有些向後移植可能是必要的,但你確實應該着眼於現在任何一天更新您的應用程序,因爲3.2將停產。

1

如果你不介意在你的應用程序原始的SQL語句,你可以用

Minute.where(event_id: Event.joins(
    "INNER JOIN (SELECT url, MIN(date) AS minDate FROM events GROUP BY name) groupedEvents ON events.name = groupedEvents.name AND events.date = groupedEvents.minDate" 
)) 

做這一切在一個呼叫如果你不介意做兩次調用分貝話,我肯定會一起去Max的建議的可讀性

ids = Event.order(date: :asc).uniq_by(&:name).map(&:id) 
minutes = Minute.where(event_id: ids) 
+0

我試圖避免將所有事件從數據庫中拉出來,僅用於'id'列。 – max

相關問題