0

I have this line of code in my rails 4 application,

= link_to t('first_name'), url_for(sort: "users.first_name"), style: 'color: white'

it sorts my table of users first names alphabetically on the first click. I've been trying to find a way to make it sort first names in reversed alphabetical order on the second click following this format but to no avail any suggestions?

The controller responsible for this according to my log is

def set_memberships
        @memberships = current_organization.memberships
          .includes(:roles, :user, linked_membership: :organization)
        if params[:action] == 'retired_memberships'
          @memberships = @memberships
            .joins("INNER JOIN users on users.id = memberships.user_id")
            .joins("LEFT OUTER JOIN memberships as linked_memberships ON memberships.linked_membership_id = linked_memberships.id")
            .where("(memberships.linked_membership_id is NOT NULL AND memberships.retired = true AND linked_memberships.retired = false) OR 
              (memberships.retired = true AND memberships.linked_membership_id IS NULL)")
            .where(retired: true)
        else
          @memberships = @memberships
            .joins("INNER JOIN users on users.id = memberships.user_id")
            .joins("LEFT OUTER JOIN memberships as linked_memberships ON memberships.linked_membership_id = linked_memberships.id")
            .where("(memberships.linked_membership_id IS NUll AND memberships.retired = false) OR 
              (memberships.linked_membership_id is NOT NULL AND memberships.retired = false AND linked_memberships.retired = true)")
        end
        @sort_field = params[:sort].presence || "users.last_name"
        @memberships = @memberships.order(@sort_field).page(params[:page]).per(30)
      end

Probably worth noting that this controller sorts by more then just first names but I'm asking for first names to keep it simple.

Cristof.M
  • 25
  • 7

2 Answers2

0

The order(@sort_field) is responsible for sorting.

https://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-order

The default is ASC - ascending, but you can pass in DESC - descending.

Kalman
  • 8,001
  • 1
  • 27
  • 45
  • I know I can sort it ASC or DESC individually but I can't seem to figure out how to get it to do both. If I use the reorder() it completely overrides my original order() and so only sorts DESC instead. – Cristof.M Nov 04 '19 at 15:07
  • On first click I would like it to sort ASC on second click I would like it to sort DESC. I haven't been able to figure out how to do that. I can only get it to do one or the other – Cristof.M Nov 04 '19 at 15:15
  • 1
    well... you need to know which one you are on now. maybe save sort inside a session. Then you can check the session param and if you are on ASC, then do DESC and if you are on DESC - then do ASC – Kalman Nov 04 '19 at 15:17
  • https://stackoverflow.com/questions/22065117/rails-how-to-store-data-in-session – Kalman Nov 04 '19 at 15:17
0

You can insert an sql fragment into the order method. So this will work:

User.order('name desc')
AJFaraday
  • 2,411
  • 1
  • 16
  • 39