我在Rails项目中遇到问题。在以前的项目(不是Rails)中,我只是在PostgreSQL中使用“inet”类型来存储带有子网的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这样做,或者有一种用字符串替代它的方法?还是另一个 gem ?

当我尝试存储内容时,甚至当我尝试从数据库中读取现有值时,都会出现问题。

只是更详细一点:
 IPAddr.new("192.168.1.2/255.255.255.252")

创建数据库条目:
 192.168.1.0/24

最佳答案

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

以下几件事可能会有所帮助:

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

    如果在查询中告诉PostgreSQL将值转换为字符串,然后再将其返回到Active Record,则可能会有所帮助。那时,您可以使用IPAddress在解析值之后使用它。如何告诉Active Record告诉PostgreSQL这样做是一个不同的问题。
  • 关于ruby-on-rails - 避免Rails将PostgreSQL inet类型转换为IPAddr对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22772462/

    10-13 01:14