【问题标题】:Sorting select results排序选择结果
【发布时间】:2019-08-21 19:02:46
【问题描述】:

我正在尝试按字母顺序对 c.description 进行排序,但我不熟悉 Ruby,似乎无法让 .sort 工作。

cakes.select do |cake|
  cake.categories.pluck(:id).any? do |ca| 
    category.self_and_descendant_ids.include? ca
  end.map { |c| { id: c.form_descriptor, name: "#{c.description}" } }
end

【问题讨论】:

  • 您能否向我们简要介绍一下您的数据是如何布局的以及您整体上要做什么?这个查询可能会被简化。
  • 要突出显示代码块,将其缩进四个空格或选择它并单击代码输入框上方的 {} 图标。要突出显示句子中的代码,请用反引号字符 (`) 将其括起来,这通常是转义键下方的一个键。
  • @Josh 请描述一下你要做什么?

标签: ruby-on-rails ruby


【解决方案1】:

如果您在 IRB 中运行您编写的代码,我不相信它会起作用。我们能否为您的数据结构提供更好的示例?您可能希望为此留在数据库中。目前尚不清楚您的“类别”变量来自何处。内部有吗?后跟地图不起作用(地图对可枚举进行操作,any? 返回一个布尔值)。

你的 pluck(:id) 是 N+1 并且会为每个蛋糕往返于数据库,不包括 self_and_descendant_ids 正在做的任何事情 - 似乎是一个建模问题,因为你可以将类别与蛋糕相关联并完成有任何后代的概念,但这都是在不了解您的数据或您正在建模的内容的情况下进行的推测。

Categories.joins(:cakes)
          .where(cakes: { id: cake_ids })
          .order(description: :asc)
          .pluck(:form_descriptor, :description)
          .map { |id, name| { id: id, name: name } }

【讨论】:

    【解决方案2】:

    如果我要按字母顺序对描述进行排序,我可以使用

    sorted_cakes = cakes.sort { |cake_a, cake_b| cake_a.description <=> cake_b.description }

    如果您希望它们按字母倒序排列,您可以将其更改为cake_b.description <=> cake_a.description

    【讨论】:

    • @Sara 推荐的另一个选项是使用cakes.sort_by { |cake| cake.description }
    【解决方案3】:

    为什么不在遍历之前排序呢?你可以这样做

    cakes.select do |cake|
      cake.categories.order('categories.description ASC').pluck(:id).any? do |ca| 
        category.self_and_descendant_ids.include? ca
      end.map { |c| { id: c.form_descriptor, name: "#{c.description}" } }
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-12
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      相关资源
      最近更新 更多