给定特定订单的

时间:2016-02-04 19:03:49

标签: ruby-on-rails ruby activerecord

我有活动,有日期和名字,有很多分钟

我需要找到按日期排在第一位的所有事件,以获得给定的名称,然后收集与这些事件相关的所有分钟。

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

几乎有效。除了我最终得到一个数组,而不是一个ActiveRecord :: Relation,我真的想从Minute开始并将它变成像...这样的范围Minute.first_time_events()给了我所有来自事件的分钟这是第一个按日期命名的事件。

最后一点需要注意,我正在使用rails 3.2。感谢

2 个答案:

答案 0 :(得分: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"
))

如果你不介意给db打两次电话,那么我肯定会考虑到Max的建议的可读性

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

答案 1 :(得分:0)

我会拉出事件的ids,然后在范围内使用它来获取分钟。

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

这里需要注意的是,这就是我在Rails 4中的表现。一些向后移植可能是必要的,但你应该专注于更新你的应用程序,因为3.2现在任何一天都将成为EOL。