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

时间:2017-07-17 03:56:07

标签: ruby-on-rails database activerecord rails-activerecord active-record-query

基本上我想得到每个不同名字的第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

有没有办法在一个查询中执行此操作。或者我是否需要为每个不同的名称查询一次?

我一直在尝试使用群组功能,但无法让它返回除每个群组的最后一条记录以外的任何内容。

1 个答案:

答案 0 :(得分:2)

您可以使用order按照name属性订购记录:

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

然后使用pluck仅获取namefield1属性:

# => [["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"}