我正在使用一些改编自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
属性相关联。我选择了结构,但我没有结婚。
我怎么能干净利落地做到这一点?我甚至为此采用了正确的方法吗?
答案 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。有一天,我会掌握它。