2015-02-10 100 views
0

我在我的postgresql表中包含ip地址的「ip」列。我想按升序對這些IP地址進行排序。下面是例如數據如何我可以使用postgresql在Rails 4中對ip地址進行排序

147.226.211.40 
    1.39.80.12 
    128.237.199.43 

結果應該是

1.39.80.12 
    128.237.199.43 
    147.226.211.40 

在其它方式圍繞,因此,如果IP地址是A.B.C.D然後排序a,然後由B,然後通過c和然後d。

這下面不適用於模型中的我。

default_scope { order('ip ASC') } 

我該怎麼辦呢?

+0

IPv4地址實際上可以存儲爲32位整數。我想知道'1.39.80。,12.97'是什麼。 – 2015-02-10 18:53:24

+0

這是我的錯誤,當提出問題。 – Kashiftufail 2015-02-10 18:58:42

+0

實際上,IPv4地址*是一個32位整數。 – 2015-02-11 22:28:38

回答

4

PostgreSQL支持inet數據類型。使用正確的數據類型,許多問題就會消失。

scratch=# create table test (
scratch(# ip_addr inet not null); 
CREATE TABLE 
scratch=# insert into test values ('147.226.211.40'); 
INSERT 0 1 
scratch=# insert into test values ('1.39.80.12'); 
INSERT 0 1 
scratch=# insert into test values ('128.237.199.43'); 
INSERT 0 1 
scratch=# select * from test order by ip_addr; 
 
    ip_addr  
---------------- 
1.39.80.12 
128.237.199.43 
147.226.211.40 
(3 rows) 

ActiveRecord支持INET數據類型。簡單來說 。 。 。

$ bin/rails generate scaffold IpAddr ip_addr:inet 

編輯控制器。訂購編號:ip_addr

$ head -9 app/controllers/ip_addrs_controller.rb 
class IpAddrsController < ApplicationController 
    before_action :set_ip_addr, only: [:show, :edit, :update, :destroy] 

    # GET /ip_addrs 
    # GET /ip_addrs.json 
    def index 
    @ip_addrs = IpAddr.all.order(:ip_addr) 
    #      ^^^^^^^^^^^^^^^ 
    end 

瀏覽到該頁面,您會發現IP地址的排序正確。

0

只投給INET訂貨的目的:

ORDER BY ip::inet ASC 

這應該工作:

default_scope { order('ip::inet ASC') } 

或者,你的情況與壞數據,這可能會工作,雖然這將是可怕的緩慢而不創建索引:

ORDER BY regexp_replace(ip, '.?([3-9]\d{2}|25[6-9]|2[6-9]\d)', '')::cidr 
+0

錯誤是「PG :: InvalidTextRepresentation:錯誤:類型inet的無效輸入語法:」12.33.44.555「:SELECT」ip_addresses「。* FROM」ip_addresses「ORDER BY IP :: inet ASC」 – Kashiftufail 2015-02-10 19:03:08

+0

顯然它不會工作if你的IP地址是無效的。 – 2015-02-10 19:05:53

+1

@ Kashiftufail:12.33.44.555不是有效的IP地址,您的輸入有問題。至少你現在知道爲什麼你應該使用最匹配的數據類型和一些輸入驗證。 – 2015-02-10 19:07:32

相關問題