2016-02-04 56 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