Reputation: 41
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
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