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