首页 > 解决方案 > Rails ActiveRecord 查询按天排序

问题描述

我正在尝试对我的记录进行排序/排序以在 Chart.js 中显示它们

我想按升序显示周一到周日的餐单,每天有 3 种不同的餐点。如果每天都有每顿饭,这有点工作,但是如果没有订购一种饭菜,例如,日子的顺序会变得很奇怪。

这是一个没有按我预期工作的示例:

在此处输入图像描述

所以正如你所看到的(不要介意德语:D)开始是正确的星期一,......星期四,......星期六,这很好,但是星期五的订单(绿色的)是另一顿饭其他日子,所以星期五在星期六之后显示,但我希望它在星期四和星期六之间显示。

这是我对 ActiveRecord 的查询:

    def self.weeklyVollkostOverview
        where(day: Date.today.beginning_of_week..Date.today.end_of_week).where(dish_type: 0).group(:day).order("day ASC").count
    end

    def self.weeklySchonkostOverview
        where(day: Date.today.beginning_of_week .. Date.today.end_of_week).where(dish_type: 1).group(:day).order("day ASC").count
    end

    def self.weeklyVegetarischOverview
        where(day: Date.today.beginning_of_week .. Date.today.end_of_week).where(dish_type: 2).group(:day).order("day ASC").count
    end

在我的控制器中,我正在映射结果:

    @weeklyVoll = OrderCard.weeklyVollkostOverview.map { |key, value| [I18n.l(key, format: "%A", locale: :'de'), value]}
    @weeklySchon = OrderCard.weeklySchonkostOverview.map { |key, value| [I18n.l(key, format: "%A", locale: :'de'), value]}
    @weeklyVegetarisch = OrderCard.weeklyVegetarischOverview.map { |key, value| [I18n.l(key, format: "%A", locale: :'de'), value]}

最后,我在图表中显示结果。

有什么我可以做的不同的或者更容易的吗?我知道我可以使用 Groupdate-Gem,但是日期对象和时区转换存在问题,所以我尝试手动进行。

编辑:

在我看来,变量@weeklyVoll、@weeklySchon 和@weeklyVegetarisch 用于显示图表所在的位置:

<%= column_chart [
        { name: "# Bestellungen Vollkost", data: @weeklyVoll },
        { name: "# Bestellungen Schonkost", data: @weeklySchon },
        { name: "# Bestellungen Vegetarisch", data: @weeklyVegetarisch }
        ],
        colors: ["red", "yellow", "green"],
        xtitle: "Wochentag", 
        ytitle: "# Bestellungen",  
        legend: true,
        legend: "bottom",
        messages: { empty: "Noch keine Daten vorhanden!" },
        library: { scales: { yAxes: [{ gridLines: { display: true }, ticks: { precision: 0 } } ] }, animation: {easing: 'easeOutQuad', duration: 2500} }
 %>

任何帮助表示赞赏!谢谢!

标签: ruby-on-railsrubypostgresqlactiverecord

解决方案


我认为问题在于三个不同的数组。如果您要在 day/dish_type 上分组,然后在最后调用 count 它应该会给出类似['Day', 'Dish Type'] => 3. 然后,您将不得不根据需要重新遍历和格式化。我倾向于使用each_with_object.

OrderCard.where(day: Date.today.all_week)
  .group(:day, :dish_type).count
# => ['Day', 'Dish Type'] => 3

推荐阅读