bonum_cete
bonum_cete

Reputation: 4962

arrange active record results against an array

I have array of active record objects that I want to sort in a particular order.

There could be 0 - 5 results:

[#<Milestone id: 657708, event_id: 2426, event_type: "Part", data_type: "setup_required", date_at: "2014-11-13 06:27:05", user_id: 1003>, #<Milestone id: 657707, event_id: 2426, event_type: "Part", data_type: "setup_ready", date_at: "2014-11-13 06:27:05", user_id: 1003>]

This is the array of the that I want to sort it by.

status = %w[setup_ready setup_required bom_processing pending_approval part_live]

I want to sort data_type against the elements of the array.

so in this case, my results would be this:

[#<Milestone id: 657707, event_id: 2426, event_type: "Part", data_type: "setup_ready", date_at: "2014-11-13 06:27:05", user_id: 1003>, #<Milestone id: 657708, event_id: 2426, event_type: "Part", data_type: "setup_required", date_at: "2014-11-13 06:27:05", user_id: 1003>]

Code after suggestion:

milestones = Milestone.where(event_id: params[:id])
status = %w[setup_ready setup_required bom_processing pending_approval part_live]
@part_milestones = milestones.sort_by {|m| status.index(m.data_type)}

milestones = [#<Milestone id: 657708, event_id: 2426, event_type: "Part", data_type: "setup_required", date_at: "2014-11-13 06:27:05", user_id: 1003>, #<Milestone id: 657707, event_id: 2426, event_type: "Part", data_type: "setup_ready", date_at: "2014-11-13 06:27:05", user_id: 1003>]

@part_milestones = [#<Milestone id: 657708, event_id: 2426, event_type: "Part", data_type: "setup_required", date_at: "2014-11-13 06:27:05", user_id: 1003>, #<Milestone id: 657707, event_id: 2426, event_type: "Part", data_type: "setup_ready", date_at: "2014-11-13 06:27:05", user_id: 1003>]

Solved by adding to_s:

@part_milestones = milestones.sort_by {|m| status.index(m.data_type.to_s)}

Upvotes: 0

Views: 49

Answers (1)

infused
infused

Reputation: 24337

Assuming milestones contains the collection of Milestone ActiveRecord objects:

milestones = Milestone.all
status = %w[setup_ready setup_required bom_processing pending_approval part_live]

sorted_milestones = milestones.sort_by {|m| status.index(m.data_type)}

If there are any milestone data_types that do not exist in the status list, they should get sorted to the end of the array.

Upvotes: 1

Related Questions