2016-04-13 3 views
0

Этот был мой запрос, чтобы получить список стран, а также с городами:Ruby On Rails сортировать по приоритетам

@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 

В результате вывода были следующие:

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 

И мнение:

<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> 

В настоящее время выпадаете результаты из списка:

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

Как я могу гарантировать, что Malaysia всегда будет располагаться в верхней части выпадающих списков? Благодаря!!

+0

Что SQL вы используете? MySQL, Postgre? –

+0

@ magni- Я использую Postgres – d3bug3r

ответ

1

Как насчет:

@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 

В Postgres, false сортируется перед тем true (см этот ответ здесь: Custom ORDER BY Explanation)

+0

ах, сейчас он работает! как получилось, что set 'country! = 'Malaysia'' делает« Малайзию »наверху? – d3bug3r

+1

Посмотрите ссылку для более подробного объяснения, но в основном: строки, которые имеют 'country' как' Malaysia', будут иметь 'country! = 'Malaysia'' для оценки' false', и эти строки сортируются над строками, где это оценивается на 'true' –

0

Вы можете настроить запросе, как это:

@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 

Так мы устанавливаем порядок Малайзии = 2, и другие = 1, чтобы обеспечить результат с Малайзией будет на вершине.

+0

Нет, результат кажется не меняющимся в порядке появления – d3bug3r

+0

@ d3bug3r: Хм, я просто модифицирую свой ответ, попробую еще раз! –

+0

Хорошо, теперь он показывает мне некоторые ошибки. PG :: SyntaxError: ОШИБКА: синтаксическая ошибка в точке или рядом с "ЗАКАЗАТЬ" LINE 1: ... "products". "Country", "products". "City" ORDER BY ORDER BY ' – d3bug3r