Rails在循环内创建多维数组

时间:2013-09-11 01:44:15

标签: ruby-on-rails

我正在尝试遍历接下来7天的数组,并为每个数组执行查询以查找匹配的所有“时间段”,并将这些添加到我可以在视图中循环的对象。这在PHP中相当简单,但我不确定rails中的语法。我有一种情况,每天都有多个'交付位'可用,我需要在下一周,白天显示所有这些插槽。

到目前为止我的控制器已经

d = Date.today
d2 = d + 1.week
@days = (d..d2).to_a
@deliveries = []
@days.each do |d|
  @deliveries[][dayname] = d.strftime("%a")
  @deliveries[][slots] = Model.where("day = ?", d.strftime("%w"))
end

然后在我看来,我想这样做

<% @deliveries.each do |d| %>
  <%= d.dayname %>
  <% d.slots.each do |s| %>
    <%= slot data here %>
  <% end %>
<% end %>

我哪里错了?不太确定你在php中使用“as key =&gt; value”的rails中的语法。这是最有效的方法吗?这将导致7个查询不理想

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

如果您的Model只有一个天数,slots每周都会相同,您可以执行以下操作:

slots_by_day = Model.all.group_by(&:day)
@deliveries = (Date.today..Date.today + 6.days).each_with_object({}) do |day, dayname_groups|
  dayname_groups.merge!(day.strftime('%a') => slots_by_day[day.strftime('%w').to_i])
end

它将获取所有模型,按星期的天数对它们进行分组,然后构建每天数字的哈希映射,其中日期名称最后以哈希值结尾:

=> {"Wed"=>[#<Model...>, #<Model...>, #<Model...>, #<Model...>],
"Thu"=>[#<Model...>, #<Model...>, #<Model...>, #<Model...>], "Fri"=>...}

哈希将像这样使用:

<% @deliveries.each do |dayname, slots| %>
  <%= dayname %>
  <% slots.each do |s| %>
    <%= slot data here %>
  <% end %>
<% end %>