【问题标题】:rails group by and order by columnrails 按列分组和排序
【发布时间】:2017-05-25 11:54:43
【问题描述】:

在我的控制器中,我将所有 Extras 按类别分组:

def index
  @categories = Extra.all.group_by(&:category)
end

结果类似于哈希数组:

{#<Category id:1, sort:2> => [#<Extra id:1>,#<Extra id:2],
 #<Category id:2, sort: 1> => [#<Extra id:3>,#<Extra id:4>]}

我想按类别“排序”列而不是 id 进行排序,应该如下所示:

{#<Category id:2, sort:1> => [#<Extra id:3>,#<Extra id:4],
 #<Category id:1, sort: 2> => [#<Extra id:1>,#<Extra id:2>]}

当我尝试时:

def index
  @categories = Extra.all.group_by(&:category).sort_by{|s| s[:sort]}
end

我得到“没有将符号隐式转换为整数”。那是因为我在“sort_by”中使用了一个符号吗?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    试试这个,group_by 会返回给你hash,而你正试图在[#&lt;Category id:2, sort:1&gt;, [#&lt;Extra id:3&gt;,#&lt;Extra id:4]] 的数组上调用[:sort]

    你应该把它们放在两个变量|key, value| 中,键是category

    def index
      @categories = Extra.all.group_by(&:category).sort_by{|category, _extras| category.sort }
    end
    

    【讨论】:

    • 这就是我想要的。这是两个变量的好点!谢谢
    • 只是为了帮助别人,你不需要在category上调用.sort,你只需要返回值进行排序。在这种情况下,该属性实际上称为sort。但如果是name,您只需致电category.name
    【解决方案2】:

    使用order方法对数据库进行排序:

    @categories = Extra.order(sort: :asc).group_by(&:category)
    

    【讨论】:

    • 我尝试了你的建议,我相信只能按排序订购额外产品,因为它直接链接在额外类上。 @deepak-mahakale 致力于对后者(类别)进行排序。谢谢
    • 我结束了使用你的建议,因为我也有一些额外的东西。
    • @DanielSousa:如果相关表可以很大,那么在数据库中也执行group by操作会更有效,使用Active Record group method
    猜你喜欢
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 2011-07-04
    相关资源
    最近更新 更多