Ruby使用索引从循环到查找JSONB

时间:2019-09-10 00:06:44

标签: ruby-on-rails ruby

我有一个JSONB列,其中保存store的营业时间。如下所示,它似乎并没有保持其输入顺序(星期日的开/关时间,星期一的开/关时间)。

我想遍历一周中的每一天以产生每天的结果,并使用day查找相应的#{day}_opens_at显示时间。但是我不确定如何使用循环索引来做到这一点。而不是sunday 09:00:00 - 18:00:00,它会打印出所有时间:

sunday
08:00:00 09:00:00 20:00:00 18:00:00

monday
08:00:00 09:00:00 20:00:00 18:00:00

tuesday
08:00:00 09:00:00 20:00:00 18:00:00

查看

<% I18n.t('date.day_names').each_with_index do |day, wday| %>
  <p>#{day.downcase}</p>
  <% @store.business_hours.each do |day, hour| %>
    <%= hour %>
  <% end %>
<% end %>
>> @store.business_hours
=> {"monday_opens_at"=>"08:00:00", "sunday_opens_at"=>"09:00:00", "monday_closes_at"=>"20:00:00", "sunday_closes_at"=>"18:00:00"}
>> @store.business_hours.first
=> ["monday_opens_at", "08:00:00"]

编辑

我能够在@jvillian和自定义帮助程序方法的帮助下使其产生可读时间Sunday 09:00 AM - 06:00 PM

- I18n.t('date.day_names').each do |day|
  - %w[opens_at closes_at].each_with_object([]) do |time_type, to_return|
    - @hours = to_return << @store.business_hours["#{day.downcase}_#{time_type}"]
      - @hours.compact.tap do |hours|
        - unless hours.blank?
          %p= day
          %p= time_helper(hours)
def time_helper(time)
  times = []
  time.each do |n|
    times <<  Time.parse(n).strftime("%I:%M %p")
  end
  times.join(' - ')
end

1 个答案:

答案 0 :(得分:1)

给出:

@store = OpenStruct.new({business_hours: {"monday_opens_at"=>"08:00:00", "sunday_opens_at"=>"09:00:00", "monday_closes_at"=>"20:00:00", "sunday_closes_at"=>"18:00:00"}})

关于以下方面的事情如何?

I18n.t('date.day_names').each do |day|
  %w(opens_at closes_at).each_with_object([]) do |time_type, to_return|
    to_return << @store.business_hours["#{day.downcase}_#{time_type}"]
  end.compact.tap do |hours|
    unless hours.blank?
      puts day
      puts hours.join(' - ')
    end
  end
end

我意识到它不是erb格式,对此感到抱歉。我不再使用erb并对语法感到生疏。但是,该逻辑可在控制台中运行,给出:

sunday
09:00:00 - 18:00:00
monday
08:00:00 - 20:00:00

...并将其放入erb不应太重。