我的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
答案 0 :(得分:2)
如果我没记错,192.168.1.0/30
在技术上是正确的。
以下是一些可能会有所帮助的事情:
如果您打算使用PostgreSQL通过其内置的IP功能来处理子网划分需求,那么将地址存储为PostgreSQL“inet”类型就可以了。如您所知,如果您只想存储IP地址并检索它,这是一个坏主意。 Active Record尝试遵守字段类型,并将其映射到最接近的Ruby类,即IPAddr。相反,我总是将我的IP存储为字符串,以我想要的形式快速检索,并作为一个适当大小的整数,所以我可以做所有的子网操作和二进制匹配。
如果在查询中告诉PostgreSQL将值转换为字符串,然后将其返回到Active Record,则可能会有所帮助。此时,您可以在解析之后使用IPAddress来处理该值。如何告诉Active Record告诉PostgreSQL这样做是一个不同的问题。