代码之家  ›  专栏  ›  技术社区  ›  Str8WaveDave

如何在rails中获得表中每个不同名称的第n条记录?

  •  3
  • Str8WaveDave  · 技术社区  · 8 年前

    基本上,我想得到每个不同名称的第n条最后记录。

    如果我有一张桌子看起来像

    name    field1
    a        1
    b        3
    a        4
    a        2
    c        1
    c        0
    b        3
    b        2
    c        1
    

    我想查询每个不同名称的第二条记录(n=2)

      name    field1
       a       4
       c       0
       b       3
    

    有没有办法在一个查询中做到这一点。或者我需要为每个不同的名称查询一次吗?

    我一直在尝试使用group函数,但除了每个组中的最后一条记录之外,无法让它返回任何内容。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Sebastián Palma    8 年前

    您可以使用 order 通过他们的 name 属性:

    # => [#<model:0x007f8293e61820 id: 1, name: "a", field1: "1"...,
     ...
     #<model:0x007f8293e60150 id: 9, name: "c", field1: "1"...]
    

    然后使用 pluck 仅获取 field1

    # => [["a", "1"], ["a", "4"], ["a", "2"], ["b", "3"], ["b", "3"], ["b", "2"], ["c", "1"], ["c", "0"], ["c", "1"]]
    

    有了它,您可以将结果作为哈希进行处理并使用 group_by 要按第一个元素对其进行分组:

    # => {"a"=>[["a", "1"], ["a", "4"], ["a", "2"]], "b"=>[["b", "3"], ["b", "3"], ["b", "2"]], "c"=>[["c", "1"], ["c", "0"], ["c", "1"]]}
    

    然后使用map获取主哈希中每个键值的第二个数组值:

    # => [["a", "4"], ["b", "3"], ["c", "0"]]
    

    Model
      .order(:name)
      .pluck(:name, :field1)
      .group_by(&:first)
      .map{|_,v| v[1]}
      .to_h
    # => {"a"=>"4", "b"=>"3", "c"=>"0"}