Rails:如何对结构数组进行分组

时间:2014-07-02 20:48:57

标签: ruby-on-rails arrays struct

我正在使用一些改编自Railscast#213的代码来处理日历。我的模型Calendar有很多Events。目前,在我的控制器中,我有:

@events_by_date = @calendar.events.group_by(&:event_date)

这将返回按event_date分组的数组哈希值,该数组是Events的虚拟属性:

{ Tue, 01 Jul 2014=>[#<Event...>, #<Event...>, ...],
  Wed, 02 Jul 2014=>[#<Event...>, #<Event...>, ...],
  ... }

我需要做的是:取代上述内容,在原始的未分组事件集中取每个Event,并将其放在EventHolder结构中,如下所示:

EventHolder = Struct.new(:event, :position)

其中:event将保留Event记录,:position需要保存与记录关联的值,但这不是记录本身的一部分。我需要它是这样的,因为每个Event都需要存在(被复制到)多个数组,并且在每个实例中都有不同的:position

例如:

event_list = Array.new
@calendar.events.each do |event|
  event_holder = EventHolder.new
  event_holder.event = event
  event_holder.position = 1
  event_list.push(event_holder)
end

到目前为止这个工作正常,给我一系列结构如下:

[#<struct Calendar::EventHolder event=#<Event ...>, position=1>,
 #<struct Calendar::EventHolder event=#<Event ...>, position=1>,
 ...]

到目前为止一切顺利。但是现在,我需要做的是在我的event_date模型中使用相同的虚拟属性Event对这些结构进行分组。就像原始语句一样,但是将结构分组而不是事件本身。我想要出现的是这样的:

{ Tue, 01 Jul 2014=>[#<struct Calendar::EventHolder event=#<Event ...>, position=1>,
                     #<struct Calendar::EventHolder event=#<Event ...>, position=1>,
                     ...],
  Wed, 02 Jul 2014=>[#<struct Calendar::EventHolder event=#<Event ...>, position=1>,
                     #<struct Calendar::EventHolder event=#<Event ...>, position=1>,
                     ...],
  ...}

基本上,我正在寻找与原始group_by方法几乎完全相同的内容,只是我希望每个Event都打包在某些中我可以拥有的内容它们像以前一样按event_date分组,但与属于“事件”记录本身的:position属性相关联。我选择了结构,但我没有结婚。

我怎么能干净利落地做到这一点?我甚至为此采用了正确的方法吗?

1 个答案:

答案 0 :(得分:0)

想出来。我一直在event_list

上使用这个陈述
event_list.group_by(&:event.event_date)

这是一个错误。这就是那个诀窍:

event_list.group_by{ |e| e.event.event_date }

我得到了答案here。还在试图找出Blocks, Procs, and Lambdas。有一天,我会掌握它。