避免Rails将PostgreSQL inet类型转换为IPAddr对象?

时间:2014-03-31 21:24:30

标签: ruby-on-rails ruby postgresql ruby-on-rails-4 inet

我的Rails项目有问题。在以前的项目(不是Rails)中,我只使用了" inet"键入PostgreSQL以存储带子网的IP地址,如下所示:

 192.168.1.0/30 
 192.168.1.1/30
 192.168.1.2/30
 192.168.1.3/30

这是将IP和子网存储在一个字段中的好方法。现在我在Rails(4.0.1)和Ruby(2.0.0 p247)中使用inet类型,但在我阅读和尝试时,Rails将其转换为IPAddr对象。但是这个IPAddr对象正在破坏我的格式。它将上面的四个示例转换为以下内容:

 192.168.1.0/30

有没有办法阻止Rails这样做,或者有没有办法用字符串替换它?或者也许是另一颗宝石?

当我尝试存储某些内容时,即使我尝试从数据库中读取现有值时,也会出现问题。

更加细化:

 IPAddr.new("192.168.1.2/255.255.255.252") 

创建数据库条目:

 192.168.1.0/24

1 个答案:

答案 0 :(得分:2)

如果我没记错,192.168.1.0/30在技术上是正确的。

以下是一些可能会有所帮助的事情:

  • 除了IPAddr之外,使用IPv4和IPv6的一个非常好的宝石是IPAddress。如果Active Record已经将值传递给IPAddr并且它已经更改了值,那么它将无济于事,因此您需要告诉Active Record使用IPAddress。
  • 如果您打算使用PostgreSQL通过其内置的IP功能来处理子网划分需求,那么将地址存储为PostgreSQL“inet”类型就可以了。如您所知,如果您只想存储IP地址并检索它,这是一个坏主意。 Active Record尝试遵守字段类型,并将其映射到最接近的Ruby类,即IPAddr。相反,我总是将我的IP存储为字符串,以我想要的形式快速检索,并作为一个适当大小的整数,所以我可以做所有的子网操作和二进制匹配。

    如果在查询中告诉PostgreSQL将值转换为字符串,然后将其返回到Active Record,则可能会有所帮助。此时,您可以在解析之后使用IPAddress来处理该值。如何告诉Active Record告诉PostgreSQL这样做是一个不同的问题。