如何获取 rails 中 table 中每个不同名称的第 n 条记录?
How do I get the nth record for each distinct name in a table in rails?
本质上,我想为每个不同的名称获取倒数第 n 条记录。
所以如果我有一个 table 看起来像
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
有没有办法在一次查询中做到这一点。或者我是否需要为每个不同的名称查询一次?
我一直在尝试使用群组功能,但无法将其设为 return 除了每个群组的最后一条记录之外的任何内容。
您可以使用 order
让您的记录按其 name
属性排序:
# => [#<model:0x007f8293e61820 id: 1, name: "a", field1: "1"...,
...
#<model:0x007f8293e60150 id: 9, name: "c", field1: "1"...]
然后使用pluck
只得到name
和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"}
本质上,我想为每个不同的名称获取倒数第 n 条记录。
所以如果我有一个 table 看起来像
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
有没有办法在一次查询中做到这一点。或者我是否需要为每个不同的名称查询一次?
我一直在尝试使用群组功能,但无法将其设为 return 除了每个群组的最后一条记录之外的任何内容。
您可以使用 order
让您的记录按其 name
属性排序:
# => [#<model:0x007f8293e61820 id: 1, name: "a", field1: "1"...,
...
#<model:0x007f8293e60150 id: 9, name: "c", field1: "1"...]
然后使用pluck
只得到name
和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"}