Ruby on rails 如何使用rails高效地使用group_
我有如下表格记录: 我根据Ruby on rails 如何使用rails高效地使用group_,ruby-on-rails,postgresql,ruby-on-rails-4,rails-postgresql,Ruby On Rails,Postgresql,Ruby On Rails 4,Rails Postgresql,我有如下表格记录: 我根据am、pm和none对它们进行分组 我真正需要将组按none分解为77列,因为我的none总记录是14 我正在处理的查询: SlotFormula.select([:id,:doorman,:day]).where(:zone_id => 1).order('created_at asc').group_by { |result| [result.doorman] } => {["am"]=> [ #<SlotFormula id: 165
am
、pm
和none
对它们进行分组
我真正需要将组按none
分解为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">
]
}
当前查询结果为:
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">
]
}
如果有人有更好的方法来处理它。也请分享
我真正需要按none to7
7
列对组进行细分的是什么
因为我的none
的总记录是14
您可以使用已有的相同查询,只需再添加一次迭代,使用and,将每个组(即[“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 } }
首先,您会发现groupby
更改为groupby(&:doorman)
,这将得到与使用groupby{elem | elem.doorman}
(注意,[
和]
完全相同的结果,因此您将得到[“pm”
,而不是[“pm”
其次,我们添加了.map
,它将每个切片(7)
应用于每个组的每个元素,将大于7的任何组分成多个组,每组7个
输出:
[
{
“am”=>[
[
#,
#,
#,
#,
#,
#,
#
]
]
},
{
“pm”=>[
[
#,
#,
#,
#,
#,
#,
#
]
]
},
{
“无”=>[
[
#,
#,
#,
#,
#,
#,
#
], [
#,
#,
#,
#,
#,
#,
#
]
]
}
]
这稍微改变了您的原始格式,例如,是一个散列
对象的数组
(原始是数组
对象的散列
),但主要的更改是添加了一个更高级别的数组,其中所有对象都分组在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
这有点复杂,但您将获得与额外级别的数组相同的输出(以7为一组)
输出:
{
[“am”]=>[
[
#,
#,
#,
#,
#,
#,
#
]
],
[“pm”]=>[
[
#,
#,
#,
#,
#,
#,
#
]
],
[“无”]=>[
[
#,
#,
#,
#,
#,
#,
#
],
[
#,
#,
#,
#,
#,
#,
#
]
]
}
无论哪种方式,您都可以得到所需的7个分组,只需使用您填写的更方便的分组来显示您的表格
如何将它们显示为列而不是行
您可以按如下方式在结果数组中循环:
<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>
您是否在其他列中有可用的日期?如果没有,我们应该如何确定哪个“无”
转到哪个组(第一组或第二组),按id
排序?另外,请注意,您的预期结果是不可能的,因为您将有两个[“无”]
键,这在散列中是不允许的。我没有告诉您应该如何识别哪个“无”到哪个组(第一个或第二个),按id排序。很好,你的评论很有意义。我该如何处理这个问题?请找到合适的解决方法?基本上我希望他们根据门卫
重新安排,但要考虑当天(星期一、星期二、星期三……)另一个问题:如果您使用am
或pm
的时间超过7天,会发生什么?您将始终分组7天,无论日期如何?我关于的问题“无”
是这样的:在您的预期结果中,第一个none
组和第二个none
组之间有什么区别?如何决定哪一行转到哪一组?是的,这是正确的。我将在保存结果时显示数据库中的结果(id asc)我的意思是这样的。如果上午或下午将超过7天,他们也应该被呈现,只是我们不为任何情况工作。我理解你的意思是什么。所以有很多的上午,下午和没有在db。但我们需要显示为7天(一个上午->周一到周日)7天(上午2点->周一到周日)的行。这有意义吗?我已经审查了整个答案,有意义,而且似乎它也可以满足要求。一个愚蠢的问题,我很难用这个查询创建表视图。我如何才能像我在问题中发布的那样将所有数组和哈希值精确地放入表形式?我使用的是您使用的第一个查询也推荐ave。请以表格形式创建一个类似的视图好吗?:)基本上,如果没有任何情况,结果不会从新行开始,而是一直移动到14列。它应该在每7行结束时创建一个新行。指每个组或内部组的末尾。请您以表格形式查看并发布输出结果好吗?@LearningROR我不确定您要求的查询是否是显示该表格的最佳方式,我不知道每一行的含义。问题:你能更新你的最终表格,以显示你希望使用图像表格作为输入的最终输出的确切示例吗?@LearningROR由于这篇文章中有两个问题,我建议打开一个新的问题