Ruby on Rails group_by没有使用DateTime以正确的顺序进行分组

时间:2016-06-10 19:52:41

标签: ruby-on-rails ruby ruby-on-rails-4

首先,我从我的范围中获得了一系列频道

Channel.not_archived.map { |c| channels << c }

然后我按start_time属性对其进行排序:

channels.sort! { |a, b| a.start_time <=> b.start_time }

然后我想按照他们的开始时间对他们进行分组。所以从早上8点开始的频道将组合在一起。所以我使用group_by方法:

@grouped_channels = @channels.group_by { |c| time_with_offset(c).strftime("%I:%M %P") }

time_with_offset方法:

  # Returns time with offset
  def time_with_offset(channel)
    user = current_user.time_zone.to_i
    organization = channel.organization.time_zone.to_i
    time_offset = organization -= user

    channel.start_time - time_offset.hours
  end

我在正确的小组中找回所有记录。我遇到的问题是这些群体不合规。因此,上午8:00的小组应该在上午9:00之前的小组。它现在只是奇怪的随机顺序。任何人都可以帮助我按正确的顺序得到这些吗?

2 个答案:

答案 0 :(得分:0)

如果您希望按照包含所需顺序的所有键的数组h给出的键顺序重新排序任何散列keys的键值对,请写

(keys.zip(h.values_at(*keys))).to_h

对于2.0之前的Ruby版本,请写

Hash[keys.zip(h.values_at(*keys))]

例如,

h = { b: 1, d: 2, a: 3, c: 4 }
  #=> {:b=>1, :d=>2, :a=>3, :c=>4}
keys = [:a, :b, :c, :d]

(keys.zip(h.values_at(*keys))).to_h
  #=> {:a=>3, :b=>1, :c=>4, :d=>2}

步骤如下。

a = h.values_at(*keys)
  #=> same as h.values_at(:a, :b, :c, :d)
  #=> [3, 1, 4, 2]

b = keys.zip(a)
  # => [[:a, 3], [:b, 1], [:c, 4], [:d, 2]] 
b.to_h
  #=> {:a=>3, :b=>1, :c=>4, :d=>2} 

答案 1 :(得分:0)

首先,您要排序一次,然后按不同的时间进行分组。我希望这可以解释您不受欢迎的订单。

按偏移时间排序。

channels.sort_by { |c| time_with_offset(c) }.group_by { |c| time_with_offset(c).strftime("%I:%M %P") }