如何使用 [=f11=] 有效地使用 group_by
how to efficently use group_by using rails
我有 tables 条如下记录:
我根据 am
、pm
和 none
对它们进行分组。
我真正需要将 none
的 group_by 分解为 7
7
列,因为我 none
的总记录是 14
.
我正在处理的查询:
SlotFormula.select([:id,:doorman,:day]).where(:zone_id => 1).order('created_at
asc').group_by { |result| [result.doorman] }
当前查询结果为:
=> {["am"]=>
[
#<SlotFormula id: 1659, day: "Monday", doorman: "am">,
#<SlotFormula id: 1660, day: "Tuesday", doorman: "am">,
#<SlotFormula id: 1661, day: "Wednesday", doorman: "am">,
#<SlotFormula id: 1662, day: "Thursday", doorman: "am">,
#<SlotFormula id: 1663, day: "Friday", doorman: "am">,
#<SlotFormula id: 1664, day: "Saturday", doorman: "am">,
#<SlotFormula id: 1665, day: "Sunday", doorman: "am">],
["pm"]=>
[
#<SlotFormula id: 1666, day: "Monday", doorman: "pm">,
#<SlotFormula id: 1667, day: "Tuesday", doorman: "pm">,
#<SlotFormula id: 1668, day: "Wednesday", doorman: "pm">,
#<SlotFormula id: 1669, day: "Thursday", doorman: "pm">,
#<SlotFormula id: 1670, day: "Friday", doorman: "pm">,
#<SlotFormula id: 1671, day: "Saturday", doorman: "pm">,
#<SlotFormula id: 1672, day: "Sunday", doorman: "pm">],
["none"]=>[
#<SlotFormula id: 1673, day: "Monday", doorman: "none">,
#<SlotFormula id: 1674, day: "Tuesday", doorman: "none">,
#<SlotFormula id: 1675, day: "Wednesday", doorman: "none">,
#<SlotFormula id: 1676, day: "Thursday", doorman: "none">,
#<SlotFormula id: 1677, day: "Friday", doorman: "none">,
#<SlotFormula id: 1678, day: "Saturday", doorman: "none">,
#<SlotFormula id: 1679, day: "Sunday", doorman: "none">,
#<SlotFormula id: 1680, day: "Monday", doorman: "none">,
#<SlotFormula id: 1681, day: "Tuesday", doorman: "none">,
#<SlotFormula id: 1682, day: "Wednesday", doorman: "none">,
#<SlotFormula id: 1683, day: "Thursday", doorman: "none">,
#<SlotFormula id: 1684, day: "Friday", doorman: "none">,
#<SlotFormula id: 1685, day: "Saturday", doorman: "none">,
#<SlotFormula id: 1686, day: "Sunday", doorman: "none">
]}
所需的预期结果:
=> {["am"]=>
[
#<SlotFormula id: 1659, day: "Monday", doorman: "am">,
#<SlotFormula id: 1660, day: "Tuesday", doorman: "am">,
#<SlotFormula id: 1661, day: "Wednesday", doorman: "am">,
#<SlotFormula id: 1662, day: "Thursday", doorman: "am">,
#<SlotFormula id: 1663, day: "Friday", doorman: "am">,
#<SlotFormula id: 1664, day: "Saturday", doorman: "am">,
#<SlotFormula id: 1665, day: "Sunday", doorman: "am">],
],
["pm"]=>
[
#<SlotFormula id: 1666, day: "Monday", doorman: "pm">,
#<SlotFormula id: 1667, day: "Tuesday", doorman: "pm">,
#<SlotFormula id: 1668, day: "Wednesday", doorman: "pm">,
#<SlotFormula id: 1669, day: "Thursday", doorman: "pm">,
#<SlotFormula id: 1670, day: "Friday", doorman: "pm">,
#<SlotFormula id: 1671, day: "Saturday", doorman: "pm">,
#<SlotFormula id: 1672, day: "Sunday", doorman: "pm">],
],
["none"]=>[
#<SlotFormula id: 1673, day: "Monday", doorman: "none">,
#<SlotFormula id: 1674, day: "Tuesday", doorman: "none">,
#<SlotFormula id: 1675, day: "Wednesday", doorman: "none">,
#<SlotFormula id: 1676, day: "Thursday", doorman: "none">,
#<SlotFormula id: 1677, day: "Friday", doorman: "none">,
#<SlotFormula id: 1678, day: "Saturday", doorman: "none">,
#<SlotFormula id: 1679, day: "Sunday", doorman: "none">,
],
["none"]=>[
#<SlotFormula id: 1680, day: "Monday", doorman: "none">,
#<SlotFormula id: 1681, day: "Tuesday", doorman: "none">,
#<SlotFormula id: 1682, day: "Wednesday", doorman: "none">,
#<SlotFormula id: 1683, day: "Thursday", doorman: "none">,
#<SlotFormula id: 1684, day: "Friday", doorman: "none">,
#<SlotFormula id: 1685, day: "Saturday", doorman: "none">,
#<SlotFormula id: 1686, day: "Sunday", doorman: "none">
]
}
编辑
我的另一个问题是:如何将它们显示为列而不是行?
所以,
r
表示下面的result
table
n
表示下面的none
table
Monday Tuesday Wednesday Thursday Friday Saturday Sunday
am am(mo r) am(tu r) am(we r) am(th r) am(fr r) am(sa r) am(su r)
pm pm(mo r) pm(tu r) pm(we r) pm(th r) pm(fr r) pm(sa r) pm(su r)
n n(mo r) n(tu r) n(we r) n(th r) n(fr r) n(sa r) n(su r)
n n(mo r) n(tu r) n(we r) n(th r) n(fr r) n(sa r) n(su r)
n n(mo r) n(tu r) n(we r) n(th r) n(fr r) n(sa r) n(su r)
am am(mo r) am(tu r) am(we r) am(th r) am(fr r) am(sa r) am(su r)
pm pm(mo r) pm(tu r) pm(we r) pm(th r) pm(fr r) pm(sa r) pm(su r)
n n(mo r) n(tu r) n(we r) n(th r) n(fr r) n(sa r) n(su r)
n n(mo r) n(tu r) n(we r) n(th r) n(fr r) n(sa r) n(su r)
n n(mo r) n(tu r) n(we r) n(th r) n(fr r) n(sa r) n(su r)
如果有人有更好的处理方法。也请分享。
What I really need to break down the group_by for none to 7
7
columns
as my total records of none
are 14
.
您可以使用已有的相同查询,只需再添加一次迭代,使用 Array#map
and Enumerable#each_slice
,打破每个组(即 ["am"]
、["pm"]
、["none"]
) 分成一组,每组七个对象:
SlotFormula.select(:id, :doorman, :day)
.where(zone_id: 1)
.order(created_at: :asc)
.group_by(&:doorman)
.map { |k, v| { k => v.each_slice(7).to_a } }
首先你会发现 group_by
更改为 group_by(&:doorman)
这将得到与使用 group_by { |elem| elem.doorman }
完全相同的结果(注意 [
和 ]
被删除的地方,所以你会得到 "pm"
.
而不是 ["pm"]
其次,我们添加了 .map
,它将 each_slice(7)
应用于每个组的每个元素,将任何大于 7 的组拆分为多个组,每组七个。
输出:
[
{
"am"=> [
[
#<SlotFormula:0x007f8128968ec0 id: 1, day: "Monday", doorman: "am">,
#<SlotFormula:0x007f8128968d80 id: 2, day: "Tuesday", doorman: "am">,
#<SlotFormula:0x007f8128968c40 id: 3, day: "Wednesday", doorman: "am">,
#<SlotFormula:0x007f8128968b00 id: 4, day: "Thursday", doorman: "am">,
#<SlotFormula:0x007f81289689c0 id: 5, day: "Friday", doorman: "am">,
#<SlotFormula:0x007f8128968880 id: 6, day: "Saturday", doorman: "am">,
#<SlotFormula:0x007f8128968740 id: 7, day: "Sunday", doorman: "am">
]
]
},
{
"pm"=> [
[
#<SlotFormula:0x007f8128968600 id: 8, day: "Monday", doorman: "pm">,
#<SlotFormula:0x007f81289684c0 id: 9, day: "Tuesday", doorman: "pm">,
#<SlotFormula:0x007f8128968380 id: 10, day: "Wednesday", doorman: "pm">,
#<SlotFormula:0x007f8128968240 id: 11, day: "Thursday", doorman: "pm">,
#<SlotFormula:0x007f8128968100 id: 12, day: "Friday", doorman: "pm">,
#<SlotFormula:0x007f8128973f78 id: 13, day: "Saturday", doorman: "pm">,
#<SlotFormula:0x007f8128973e38 id: 14, day: "Sunday", doorman: "pm">
]
]
},
{
"none"=> [
[
#<SlotFormula:0x007f8128973cf8 id: 15, day: "Monday", doorman: "none">,
#<SlotFormula:0x007f8128973bb8 id: 16, day: "Tuesday", doorman: "none">,
#<SlotFormula:0x007f8128973a78 id: 17, day: "Wednesday", doorman: "none">,
#<SlotFormula:0x007f8128973938 id: 18, day: "Thursday", doorman: "none">,
#<SlotFormula:0x007f81289737f8 id: 19, day: "Friday", doorman: "none">,
#<SlotFormula:0x007f81289736b8 id: 20, day: "Saturday", doorman: "none">,
#<SlotFormula:0x007f8128973578 id: 21, day: "Sunday", doorman: "none">
], [
#<SlotFormula:0x007f8128973438 id: 22, day: "Monday", doorman: "none">,
#<SlotFormula:0x007f81289732f8 id: 23, day: "Tuesday", doorman: "none">,
#<SlotFormula:0x007f81289731b8 id: 24, day: "Wednesday", doorman: "none">,
#<SlotFormula:0x007f8128973078 id: 25, day: "Thursday", doorman: "none">,
#<SlotFormula:0x007f8128972f38 id: 26, day: "Friday", doorman: "none">,
#<SlotFormula:0x007f8128972df8 id: 27, day: "Saturday", doorman: "none">,
#<SlotFormula:0x007f8128972cb8 id: 28, day: "Sunday", doorman: "none">
]
]
}
]
这会稍微改变您的原始格式,例如 Array
个 Hash
个对象(原始格式是 Hash
个 Array
个对象),但主要变化是增加了一层数组,其中所有内容都分组为 7 个对象的块。
这对于 am
和 pm
组不是很清楚,因为它们都恰好有 7 个项目,所以您会看到一个包含一个数组(内部有 7 个元素)的数组。但是使用 none
你可以看到一个数组,里面有两个数组,每个数组有 7 个项目(即对象)。
我推荐这种方法,因为使用 :pm
等键迭代和获取数据会更容易,例如:
@slot_formulas[:pm].each do |group|
group.each do |slot_formula|
# <SlotFormula:0x007f81289fae38 id: 8, day: "Monday", doorman: "pm"> ...
end
end
但是,如果您需要您已有的格式,也可以获取,但我们需要 Enumerable#each_with_object
:
而不是 map
SlotFormula.select(:id, :doorman, :day])
.where(zone_id: 1)
.order(created_at: :asc)
.group_by(&:doorman)
.each_with_object({}) { |(doorman, group), result| result[[doorman]] = group.each_slice(7).to_a }
它有点复杂,但你会得到与额外级别数组相同的输出(以 7 组为一组)。
输出:
{
["am"] => [
[
#<SlotFormula:0x007f81289fb6f8 id: 1, day: "Monday", doorman: "am">,
#<SlotFormula:0x007f81289fb5b8 id: 2, day: "Tuesday", doorman: "am">,
#<SlotFormula:0x007f81289fb478 id: 3, day: "Wednesday", doorman: "am">,
#<SlotFormula:0x007f81289fb338 id: 4, day: "Thursday", doorman: "am">,
#<SlotFormula:0x007f81289fb1f8 id: 5, day: "Friday", doorman: "am">,
#<SlotFormula:0x007f81289fb0b8 id: 6, day: "Saturday", doorman: "am">,
#<SlotFormula:0x007f81289faf78 id: 7, day: "Sunday", doorman: "am">
]
],
["pm"] => [
[
#<SlotFormula:0x007f81289fae38 id: 8, day: "Monday", doorman: "pm">,
#<SlotFormula:0x007f81289facf8 id: 9, day: "Tuesday", doorman: "pm">,
#<SlotFormula:0x007f81289fabb8 id: 10, day: "Wednesday", doorman: "pm">,
#<SlotFormula:0x007f81289faa78 id: 11, day: "Thursday", doorman: "pm">,
#<SlotFormula:0x007f81289fa938 id: 12, day: "Friday", doorman: "pm">,
#<SlotFormula:0x007f81289fa7f8 id: 13, day: "Saturday", doorman: "pm">,
#<SlotFormula:0x007f81289fa6b8 id: 14, day: "Sunday", doorman: "pm">
]
],
["none"] => [
[
#<SlotFormula:0x007f81289fa578 id: 15, day: "Monday", doorman: "none">,
#<SlotFormula:0x007f81289fa438 id: 16, day: "Tuesday", doorman: "none">,
#<SlotFormula:0x007f81289fa2f8 id: 17, day: "Wednesday", doorman: "none">,
#<SlotFormula:0x007f81289fa1b8 id: 18, day: "Thursday", doorman: "none">,
#<SlotFormula:0x007f81289fa078 id: 19, day: "Friday", doorman: "none">,
#<SlotFormula:0x007f81289f9f38 id: 20, day: "Saturday", doorman: "none">,
#<SlotFormula:0x007f81289f9df8 id: 21, day: "Sunday", doorman: "none">
],
[
#<SlotFormula:0x007f81289f9cb8 id: 22, day: "Monday", doorman: "none">,
#<SlotFormula:0x007f81289f9b78 id: 23, day: "Tuesday", doorman: "none">,
#<SlotFormula:0x007f81289f9a38 id: 24, day: "Wednesday", doorman: "none">,
#<SlotFormula:0x007f81289f98f8 id: 25, day: "Thursday", doorman: "none">,
#<SlotFormula:0x007f81289f97b8 id: 26, day: "Friday", doorman: "none">,
#<SlotFormula:0x007f81289f9678 id: 27, day: "Saturday", doorman: "none">,
#<SlotFormula:0x007f81289f9538 id: 28, day: "Sunday", doorman: "none">
]
]
}
无论哪种方式,你都得到了你需要的 7 组,只需使用你填充更多的 confortable 来展示你的 table.
How I can show them as columns not rows?
您可以像这样遍历结果数组:
<table>
<% @slots.each do |doorman_groups| %>
<% doorman_groups.each do |doorman, groups| %>
<% groups.each do |subgroups| %>
<tr>
<td><%= doorman %></td>
<% subgroups.each do |subgroup| %>
<td><%= subgroup.inspect %></td>
<% end %>
</tr>
<% end %>
<% end %>
<% end %>
</table>
我有 tables 条如下记录:
我根据 am
、pm
和 none
对它们进行分组。
我真正需要将 none
的 group_by 分解为 7
7
列,因为我 none
的总记录是 14
.
我正在处理的查询:
SlotFormula.select([:id,:doorman,:day]).where(:zone_id => 1).order('created_at
asc').group_by { |result| [result.doorman] }
当前查询结果为:
=> {["am"]=>
[
#<SlotFormula id: 1659, day: "Monday", doorman: "am">,
#<SlotFormula id: 1660, day: "Tuesday", doorman: "am">,
#<SlotFormula id: 1661, day: "Wednesday", doorman: "am">,
#<SlotFormula id: 1662, day: "Thursday", doorman: "am">,
#<SlotFormula id: 1663, day: "Friday", doorman: "am">,
#<SlotFormula id: 1664, day: "Saturday", doorman: "am">,
#<SlotFormula id: 1665, day: "Sunday", doorman: "am">],
["pm"]=>
[
#<SlotFormula id: 1666, day: "Monday", doorman: "pm">,
#<SlotFormula id: 1667, day: "Tuesday", doorman: "pm">,
#<SlotFormula id: 1668, day: "Wednesday", doorman: "pm">,
#<SlotFormula id: 1669, day: "Thursday", doorman: "pm">,
#<SlotFormula id: 1670, day: "Friday", doorman: "pm">,
#<SlotFormula id: 1671, day: "Saturday", doorman: "pm">,
#<SlotFormula id: 1672, day: "Sunday", doorman: "pm">],
["none"]=>[
#<SlotFormula id: 1673, day: "Monday", doorman: "none">,
#<SlotFormula id: 1674, day: "Tuesday", doorman: "none">,
#<SlotFormula id: 1675, day: "Wednesday", doorman: "none">,
#<SlotFormula id: 1676, day: "Thursday", doorman: "none">,
#<SlotFormula id: 1677, day: "Friday", doorman: "none">,
#<SlotFormula id: 1678, day: "Saturday", doorman: "none">,
#<SlotFormula id: 1679, day: "Sunday", doorman: "none">,
#<SlotFormula id: 1680, day: "Monday", doorman: "none">,
#<SlotFormula id: 1681, day: "Tuesday", doorman: "none">,
#<SlotFormula id: 1682, day: "Wednesday", doorman: "none">,
#<SlotFormula id: 1683, day: "Thursday", doorman: "none">,
#<SlotFormula id: 1684, day: "Friday", doorman: "none">,
#<SlotFormula id: 1685, day: "Saturday", doorman: "none">,
#<SlotFormula id: 1686, day: "Sunday", doorman: "none">
]}
所需的预期结果:
=> {["am"]=>
[
#<SlotFormula id: 1659, day: "Monday", doorman: "am">,
#<SlotFormula id: 1660, day: "Tuesday", doorman: "am">,
#<SlotFormula id: 1661, day: "Wednesday", doorman: "am">,
#<SlotFormula id: 1662, day: "Thursday", doorman: "am">,
#<SlotFormula id: 1663, day: "Friday", doorman: "am">,
#<SlotFormula id: 1664, day: "Saturday", doorman: "am">,
#<SlotFormula id: 1665, day: "Sunday", doorman: "am">],
],
["pm"]=>
[
#<SlotFormula id: 1666, day: "Monday", doorman: "pm">,
#<SlotFormula id: 1667, day: "Tuesday", doorman: "pm">,
#<SlotFormula id: 1668, day: "Wednesday", doorman: "pm">,
#<SlotFormula id: 1669, day: "Thursday", doorman: "pm">,
#<SlotFormula id: 1670, day: "Friday", doorman: "pm">,
#<SlotFormula id: 1671, day: "Saturday", doorman: "pm">,
#<SlotFormula id: 1672, day: "Sunday", doorman: "pm">],
],
["none"]=>[
#<SlotFormula id: 1673, day: "Monday", doorman: "none">,
#<SlotFormula id: 1674, day: "Tuesday", doorman: "none">,
#<SlotFormula id: 1675, day: "Wednesday", doorman: "none">,
#<SlotFormula id: 1676, day: "Thursday", doorman: "none">,
#<SlotFormula id: 1677, day: "Friday", doorman: "none">,
#<SlotFormula id: 1678, day: "Saturday", doorman: "none">,
#<SlotFormula id: 1679, day: "Sunday", doorman: "none">,
],
["none"]=>[
#<SlotFormula id: 1680, day: "Monday", doorman: "none">,
#<SlotFormula id: 1681, day: "Tuesday", doorman: "none">,
#<SlotFormula id: 1682, day: "Wednesday", doorman: "none">,
#<SlotFormula id: 1683, day: "Thursday", doorman: "none">,
#<SlotFormula id: 1684, day: "Friday", doorman: "none">,
#<SlotFormula id: 1685, day: "Saturday", doorman: "none">,
#<SlotFormula id: 1686, day: "Sunday", doorman: "none">
]
}
编辑
我的另一个问题是:如何将它们显示为列而不是行?
所以,
r
表示下面的result
table
n
表示下面的none
table
Monday Tuesday Wednesday Thursday Friday Saturday Sunday
am am(mo r) am(tu r) am(we r) am(th r) am(fr r) am(sa r) am(su r)
pm pm(mo r) pm(tu r) pm(we r) pm(th r) pm(fr r) pm(sa r) pm(su r)
n n(mo r) n(tu r) n(we r) n(th r) n(fr r) n(sa r) n(su r)
n n(mo r) n(tu r) n(we r) n(th r) n(fr r) n(sa r) n(su r)
n n(mo r) n(tu r) n(we r) n(th r) n(fr r) n(sa r) n(su r)
am am(mo r) am(tu r) am(we r) am(th r) am(fr r) am(sa r) am(su r)
pm pm(mo r) pm(tu r) pm(we r) pm(th r) pm(fr r) pm(sa r) pm(su r)
n n(mo r) n(tu r) n(we r) n(th r) n(fr r) n(sa r) n(su r)
n n(mo r) n(tu r) n(we r) n(th r) n(fr r) n(sa r) n(su r)
n n(mo r) n(tu r) n(we r) n(th r) n(fr r) n(sa r) n(su r)
如果有人有更好的处理方法。也请分享。
What I really need to break down the group_by for none to
7
7
columns as my total records ofnone
are14
.
您可以使用已有的相同查询,只需再添加一次迭代,使用 Array#map
and Enumerable#each_slice
,打破每个组(即 ["am"]
、["pm"]
、["none"]
) 分成一组,每组七个对象:
SlotFormula.select(:id, :doorman, :day)
.where(zone_id: 1)
.order(created_at: :asc)
.group_by(&:doorman)
.map { |k, v| { k => v.each_slice(7).to_a } }
首先你会发现 group_by
更改为 group_by(&:doorman)
这将得到与使用 group_by { |elem| elem.doorman }
完全相同的结果(注意 [
和 ]
被删除的地方,所以你会得到 "pm"
.
["pm"]
其次,我们添加了 .map
,它将 each_slice(7)
应用于每个组的每个元素,将任何大于 7 的组拆分为多个组,每组七个。
输出:
[
{
"am"=> [
[
#<SlotFormula:0x007f8128968ec0 id: 1, day: "Monday", doorman: "am">,
#<SlotFormula:0x007f8128968d80 id: 2, day: "Tuesday", doorman: "am">,
#<SlotFormula:0x007f8128968c40 id: 3, day: "Wednesday", doorman: "am">,
#<SlotFormula:0x007f8128968b00 id: 4, day: "Thursday", doorman: "am">,
#<SlotFormula:0x007f81289689c0 id: 5, day: "Friday", doorman: "am">,
#<SlotFormula:0x007f8128968880 id: 6, day: "Saturday", doorman: "am">,
#<SlotFormula:0x007f8128968740 id: 7, day: "Sunday", doorman: "am">
]
]
},
{
"pm"=> [
[
#<SlotFormula:0x007f8128968600 id: 8, day: "Monday", doorman: "pm">,
#<SlotFormula:0x007f81289684c0 id: 9, day: "Tuesday", doorman: "pm">,
#<SlotFormula:0x007f8128968380 id: 10, day: "Wednesday", doorman: "pm">,
#<SlotFormula:0x007f8128968240 id: 11, day: "Thursday", doorman: "pm">,
#<SlotFormula:0x007f8128968100 id: 12, day: "Friday", doorman: "pm">,
#<SlotFormula:0x007f8128973f78 id: 13, day: "Saturday", doorman: "pm">,
#<SlotFormula:0x007f8128973e38 id: 14, day: "Sunday", doorman: "pm">
]
]
},
{
"none"=> [
[
#<SlotFormula:0x007f8128973cf8 id: 15, day: "Monday", doorman: "none">,
#<SlotFormula:0x007f8128973bb8 id: 16, day: "Tuesday", doorman: "none">,
#<SlotFormula:0x007f8128973a78 id: 17, day: "Wednesday", doorman: "none">,
#<SlotFormula:0x007f8128973938 id: 18, day: "Thursday", doorman: "none">,
#<SlotFormula:0x007f81289737f8 id: 19, day: "Friday", doorman: "none">,
#<SlotFormula:0x007f81289736b8 id: 20, day: "Saturday", doorman: "none">,
#<SlotFormula:0x007f8128973578 id: 21, day: "Sunday", doorman: "none">
], [
#<SlotFormula:0x007f8128973438 id: 22, day: "Monday", doorman: "none">,
#<SlotFormula:0x007f81289732f8 id: 23, day: "Tuesday", doorman: "none">,
#<SlotFormula:0x007f81289731b8 id: 24, day: "Wednesday", doorman: "none">,
#<SlotFormula:0x007f8128973078 id: 25, day: "Thursday", doorman: "none">,
#<SlotFormula:0x007f8128972f38 id: 26, day: "Friday", doorman: "none">,
#<SlotFormula:0x007f8128972df8 id: 27, day: "Saturday", doorman: "none">,
#<SlotFormula:0x007f8128972cb8 id: 28, day: "Sunday", doorman: "none">
]
]
}
]
这会稍微改变您的原始格式,例如 Array
个 Hash
个对象(原始格式是 Hash
个 Array
个对象),但主要变化是增加了一层数组,其中所有内容都分组为 7 个对象的块。
这对于 am
和 pm
组不是很清楚,因为它们都恰好有 7 个项目,所以您会看到一个包含一个数组(内部有 7 个元素)的数组。但是使用 none
你可以看到一个数组,里面有两个数组,每个数组有 7 个项目(即对象)。
我推荐这种方法,因为使用 :pm
等键迭代和获取数据会更容易,例如:
@slot_formulas[:pm].each do |group|
group.each do |slot_formula|
# <SlotFormula:0x007f81289fae38 id: 8, day: "Monday", doorman: "pm"> ...
end
end
但是,如果您需要您已有的格式,也可以获取,但我们需要 Enumerable#each_with_object
:
map
SlotFormula.select(:id, :doorman, :day])
.where(zone_id: 1)
.order(created_at: :asc)
.group_by(&:doorman)
.each_with_object({}) { |(doorman, group), result| result[[doorman]] = group.each_slice(7).to_a }
它有点复杂,但你会得到与额外级别数组相同的输出(以 7 组为一组)。
输出:
{
["am"] => [
[
#<SlotFormula:0x007f81289fb6f8 id: 1, day: "Monday", doorman: "am">,
#<SlotFormula:0x007f81289fb5b8 id: 2, day: "Tuesday", doorman: "am">,
#<SlotFormula:0x007f81289fb478 id: 3, day: "Wednesday", doorman: "am">,
#<SlotFormula:0x007f81289fb338 id: 4, day: "Thursday", doorman: "am">,
#<SlotFormula:0x007f81289fb1f8 id: 5, day: "Friday", doorman: "am">,
#<SlotFormula:0x007f81289fb0b8 id: 6, day: "Saturday", doorman: "am">,
#<SlotFormula:0x007f81289faf78 id: 7, day: "Sunday", doorman: "am">
]
],
["pm"] => [
[
#<SlotFormula:0x007f81289fae38 id: 8, day: "Monday", doorman: "pm">,
#<SlotFormula:0x007f81289facf8 id: 9, day: "Tuesday", doorman: "pm">,
#<SlotFormula:0x007f81289fabb8 id: 10, day: "Wednesday", doorman: "pm">,
#<SlotFormula:0x007f81289faa78 id: 11, day: "Thursday", doorman: "pm">,
#<SlotFormula:0x007f81289fa938 id: 12, day: "Friday", doorman: "pm">,
#<SlotFormula:0x007f81289fa7f8 id: 13, day: "Saturday", doorman: "pm">,
#<SlotFormula:0x007f81289fa6b8 id: 14, day: "Sunday", doorman: "pm">
]
],
["none"] => [
[
#<SlotFormula:0x007f81289fa578 id: 15, day: "Monday", doorman: "none">,
#<SlotFormula:0x007f81289fa438 id: 16, day: "Tuesday", doorman: "none">,
#<SlotFormula:0x007f81289fa2f8 id: 17, day: "Wednesday", doorman: "none">,
#<SlotFormula:0x007f81289fa1b8 id: 18, day: "Thursday", doorman: "none">,
#<SlotFormula:0x007f81289fa078 id: 19, day: "Friday", doorman: "none">,
#<SlotFormula:0x007f81289f9f38 id: 20, day: "Saturday", doorman: "none">,
#<SlotFormula:0x007f81289f9df8 id: 21, day: "Sunday", doorman: "none">
],
[
#<SlotFormula:0x007f81289f9cb8 id: 22, day: "Monday", doorman: "none">,
#<SlotFormula:0x007f81289f9b78 id: 23, day: "Tuesday", doorman: "none">,
#<SlotFormula:0x007f81289f9a38 id: 24, day: "Wednesday", doorman: "none">,
#<SlotFormula:0x007f81289f98f8 id: 25, day: "Thursday", doorman: "none">,
#<SlotFormula:0x007f81289f97b8 id: 26, day: "Friday", doorman: "none">,
#<SlotFormula:0x007f81289f9678 id: 27, day: "Saturday", doorman: "none">,
#<SlotFormula:0x007f81289f9538 id: 28, day: "Sunday", doorman: "none">
]
]
}
无论哪种方式,你都得到了你需要的 7 组,只需使用你填充更多的 confortable 来展示你的 table.
How I can show them as columns not rows?
您可以像这样遍历结果数组:
<table>
<% @slots.each do |doorman_groups| %>
<% doorman_groups.each do |doorman, groups| %>
<% groups.each do |subgroups| %>
<tr>
<td><%= doorman %></td>
<% subgroups.each do |subgroup| %>
<td><%= subgroup.inspect %></td>
<% end %>
</tr>
<% end %>
<% end %>
<% end %>
</table>