ruby-on-rails - 避免 Rails 将 PostgreSQL inet 类型转换为 IPAddr 对象?

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

我的 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 之外,一个非常适合使用 IPv4 和 IPv6 的 gem 是 IPAddress .如果 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/

相关文章:

ruby-on-rails - Rails 3 的反馈 gem

linux - nohup 下 Ruby 脚本可能出现 I/O 同步问题?

ruby - Mac 用户并收到警告 : Nokogiri was built against LibXML version 2. 7.8,但已动态加载 2.7.3

匹配的正则表达式以

ruby-on-rails - 带有状态代码的葡萄自定义错误

mysql - 迁移以创建表引发 Mysql2::Error: 表不存在

c# - Dapper.net "where ... in"查询不适用于 PostgreSQL

sql - 使用 ts_vector 列进行文本搜索

ruby-on-rails - Ubuntu Nginx、Rails 和 Thin

ruby - 如何在指定半径的圆内生成随机坐标?