2016-04-13 5 views
0

Abstimmung waren meine Abfrage Liste der Länder, zusammen mit den Städten zu bekommen:Ruby on Rails Art auf Prioritäten

@countries_cities = Product.joins(:user).where("country is not null and country <> ''").where("city is not null and city <> ''").where(:users => {:merchant_status => 1}).group(:country, :city).select("country,city").as_json 

Das Ausgabeergebnis wie folgt waren:

Object[city:"Bangkok",country:"Thailand"],Object[city:"Phuket",country:"Thailand"],Object[city:"Malaysia",country:"Kuala Lumpur"],Object[city:"Malaysia",country:"Penang"],Object[city:"Shanghai",country:"China"],Object[city:"Beijing",country:"China"] 

cchs = @countries_cities.group_by{|cc| cc["country"]} 
@search_location_country = cchs 

Und die Aussicht ist:

<ul id="color-dropdown-menu" class="dropdown-menu dropdown-menu-right" role="menu"> 
     <% @search_location_country.each do |country, cities| %> 
     <li class="input" style="background:#ECECEC; "><a href="#" style="font-weight: bold;"><%= country.upcase %></a></li> 
       <% cities.each do |city| %> 
     <li class="input"><a href="#"><%= city["city"].titleize %></a></li> 
    <% end %> 
    <% end %> 
</ul> 

Jetzt folgt das Drop-down-Ergebnis diesem Muster:

Thailand 
    -Bangkok 
    -Phuket 
Malaysia 
    -Kuala Lumpur 
    -Penang 
China 
    -Beijing 
    -Shanghai 

Wie kann ich sicherstellen, dass Malaysia immer an der Spitze der Dropdown-Listen platziert wird? Vielen Dank!!

+0

Welche SQL verwenden Sie? MySQL, Postgre? –

+0

@ magni- Ich benutze Postgres – d3bug3r

Antwort

1

Wie wäre:

@countries_cities = Product.joins(:user) 
          .where.not(country: [nil, '']) 
          .where(users: {merchant_status: 1}) 
          .group(:country, :city) 
          .order("country!= 'Malaysia'") 
          .select(:country, :city) 
          .as_json 

In Postgres, false vor true sortiert (siehe diese Antwort hier: Custom ORDER BY Explanation)

+0

ah, es funktioniert jetzt !! Wie kommt es, dass 'country! = 'Malaysia'' 'Malaysia' in der Spitze macht? – d3bug3r

+1

Schauen Sie sich den Link für eine detailliertere Erklärung an, aber im Grunde: Zeilen, die 'country' als' Malaysia' haben, werden 'country! = 'Malaysia''bewerten zu' false', und diese Zeilen werden oberhalb der Zeilen sortiert, wo dies ausgewertet wird zu "wahr" –

0

Sie können Sie diese Abfrage wie anpassen:

@countries_cities = Product.joins(:user) 
          .where.not(country: [nil, '']) 
          .where(:users => {:merchant_status => 1}) 
          .group(:country, :city) 
          .order("ORDER BY 
            CASE WHEN country = 'Malaysia' THEN 1 
            ELSE 2 
            END ASC") 
          .select(:country, :city) 
          .as_json 

So setzen wir den Auftrag von Malaysia = 2, und andere = 1 das Ergebnis mit Malaysia, um sicherzustellen, auf der Spitze sein wird.

+0

Nein, das Ergebnis scheint keine Änderung in der Reihenfolge des Auftretens – d3bug3r

+0

@ d3bug3r: Hmm, ich ändere nur meine Antwort, lass es erneut versuchen! –

+0

Ok, es zeigt mir einige Fehler jetzt 'PG :: SyntaxError: FEHLER: Syntaxfehler bei oder in der Nähe von" ORDER " LINE 1: ..." Produkte "." Land "," Produkte "." Stadt "ORDER BY ORDER BY ' – d3bug3r