Charles
Charles

Reputation: 41

How to find the first submitted form record

I am getting back data that looks like this in my service

[ 
  {form_id: 1, status: 0, created_at: date form was created},
  {form_id: 1, status: 4, created_at: first submitted date}, //record i want
  {form_id: 1, status: 2, created_at: date form was returned},
  {form_id: 1, status: 4, created_at: date form was resubmitted},
  {form_id: 2, status: 0, created_at: date form was created},
  {form_id: 2, status: 4, created_at: first submitted date}, //record i want
  {form_id: 2, status: 2, created_at: date form was returned},
  {form_id: 2, status: 4, created_at: date form was resubmitted},
  {form_id: 3, status: 0, created_at: date form was created},
  {form_id: 3, status: 4, created_at: first submitted date}, //record i want
  {form_id: 3, status: 2, created_at: date form was returned},
  {form_id: 3, status: 4, created_at: date form was resubmitted},
  ]

I only need to find the records where the form was first submitted (noted with comments in the above snippet). How can I do this?

Upvotes: 0

Views: 26

Answers (1)

BTL
BTL

Reputation: 4656

I don't know if it's the most efficient way to do it but here's a solution :

  array = [
    { form_id: 1, status: 0, created_at: Date.new(2020, 2, 25) },
    { form_id: 1, status: 4, created_at: Date.new(2020, 2, 25) }, # record i want
    { form_id: 1, status: 2, created_at: Date.new(2020, 2, 26) },
    { form_id: 1, status: 4, created_at: Date.new(2020, 2, 27) },
    { form_id: 2, status: 0, created_at: Date.new(2020, 3, 25) },
    { form_id: 2, status: 4, created_at: Date.new(2020, 3, 26) }, # record i want
    { form_id: 2, status: 2, created_at: Date.new(2020, 3, 27) },
    { form_id: 2, status: 4, created_at: Date.new(2020, 3, 28) },
    { form_id: 3, status: 0, created_at: Date.new(2020, 4, 25) },
    { form_id: 3, status: 4, created_at: Date.new(2020, 4, 26) }, # record i want
    { form_id: 3, status: 2, created_at: Date.new(2020, 4, 27) },
    { form_id: 3, status: 4, created_at: Date.new(2020, 4, 28) },
  ]

  array.select { |i| i[:status] == 4 }.group_by { |i| i[:form_id] }.values.map { |i| i.sort { |a, b| a[:created_at] <=> b[:created_at] }.first }

returns: [{:form_id=>1, :status=>4, :created_at=>Tue, 25 Feb 2020}, {:form_id=>2, :status=>4, :created_at=>Thu, 26 Mar 2020}, {:form_id=>3, :status=>4, :created_at=>Sun, 26 Apr 2020}]

Upvotes: 1

Related Questions