2017-02-21 3 views
0

Я пытаюсь сортировать domains по rank, что является одним из многих ключей атрибута metrics.Заказ рельсов по атрибуту значения хеша

Это пример объекта:

Domain.all.first.attributes 
     => { 
        "id" => 1, 
        "name" => "example.com", 
       "status" => "active", 
       "country" => "Generic", 
      "languages" => [], 
        "ips" => [], 
      "created_at" => Sun, 25 Dec 2016 11:03:11 UTC +00:00, 
      "updated_at" => Mon, 06 Feb 2017 18:17:01 UTC +00:00, 
       "metrics" => { 
       "internal_code" => 14803, 
          "language" => "", 
        "rank" => 98.4011625387248 
       } 
     } 

В настоящее время я просто упорядочить по created_at:

def index 
    @domains = filter(@domains.order(created_at: :asc)) 

Как заказать домены по rank?

+0

Используйте @domains = фильтр (@ domains.order (rank: asc)) –

+0

Оценка @ChakreshwarSharma не является атрибутом. Это внутри метрики. – Tom

+0

и это модель в db с ребенком? – Fallenhero

ответ

1

Проблема в том, что он будет сортировать ранг, но как строку для ex. 0, 1, 11, 15 2, 21, 3, 40, 5

Вы должны бросить его float или integer, а затем вы можете заказать его

Domain.order("(metrics ->> 'rank')::float") 
#=> SELECT "domains".* FROM "domains" ORDER BY (metrics ->> 'rank')::float 

Вы можете заказать его в убыванию если вы хотите

Domain.order("(metrics ->> 'rank')::float DESC") 
#=> SELECT "domains".* FROM "domains" ORDER BY (metrics ->> 'rank')::float DESC 
+0

Это выбирает только поле ранга. Мне нужно заказать домены и вернуть всю информацию. – Tom

+0

Комбинация двух ответов сделала трюк: @domains = filter (@ domains.order ("(метрики - >> 'rank') :: float DESC")) – Tom

0

Попробуйте нижеследующее.

@domains = filter(@domains.order("metrics.rank")) 
+0

(pry) ошибка вывода: # Tom

1

Если это поле JSON, вы можете заказать его следующим способом.

@domains.order("metrics ->> 'rank' DESC") 
+0

Работает, но перевернуто, как сортировать с наивысшим рангом? – Tom

+0

@Tom Я обновил свой ответ. – dnsh

+0

Ваш предыдущий ответ работал, но он заказывал его по возрастанию. Как бы вы справлялись с значениями? Это не работает, так как rank float. – Tom

Смежные вопросы