ruby-on-rails-3 - 如何让 Maxmind 的 Geoip 数据库与 Postgres + Heroku 一起工作

标签 ruby-on-rails-3 postgresql heroku geoip

这里的任何人都在 Rails 3+、Heroku、Pgsql 上运行并使用 Maxmind's Geoip数据库?

在 MySql 上,我能够通过以下方式获得一个简单的查询:

IpToCountry.where('ip_to_countries.ip_number_to >= INET_ATON(?)', '24.24.24.24').order('ip_number_to ASC').limit(1).first

但是,自从转向 Pgsql 后,我试图找到一种正确查询数据库的方法。到目前为止,我有:

remote_ip_array = '24.24.24.24'.split('.')
remote_ip_number = 16777216*remote_ip_array[0].to_i + 65536*remote_ip_array[1].to_i + 256*remote_ip_array[2].to_i + remote_ip_array[3].to_i
ip_to_country = IpToCountry.where('? >= ip_number_from AND ? <= ip_number_to', remote_ip_number, remote_ip_number).order('ip_number_to ASC').limit(1).first

上述查询的问题是某些 IP 不匹配。例如:37.59.16.123108.166.92.235

我看了ip4r但因为我正在使用 http://postgres.heroku.com ,我可能没有安装这个的选项。我向支持团队发送了一封电子邮件以进行验证。

与此同时,非常感谢任何其他反馈。

最佳答案

ip4r 本身不太可能有助于匹配。如果您需要为子网建立 GIN 索引,则最需要 ip4r,例如强制执行存储的 CIDR block 不能重叠的约束。

您有两个选择。第一个也是最好的一个是使用 PostgreSQL 的 inet 类型并将 ipv4 地址存储在 inet 类型中。然后你会使用标准的文本表示。例如,比较:

select '10.59.3.1'::text > '101.3.4.1';
 ?column? 
----------
 t
(1 row)

select '10.59.3.1'::inet > '101.3.4.1';
 ?column? 
----------
 f
(1 row)

此类型包含在 vanilla PostgreSQL 中,因此您不需要插件。

第二种选择是创建一个 int(inet) 函数:

CREATE OR REPLACE FUNCTION to_int(inet) RETURNS bigint LANGUAGE SQL IMMUTABLE AS $$
SELECT $1 - '0.0.0.0';
$$;

然后

select to_int('10.0.0.1');
  to_int   
-----------
 167772161
(1 row)

这样您就可以在您的数据库中将 ipv4 转换为 int。

不过我会推荐 inet 类型。他们真的很有帮助。大多数用例不需要 ip4r。

关于ruby-on-rails-3 - 如何让 Maxmind 的 Geoip 数据库与 Postgres + Heroku 一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10383617/

相关文章:

ssl - Heroku SSL 端点, "Expires can' t 为空 Pem 无效”

ruby-on-rails - 在heroku上使用网络爬虫的经验

ruby-on-rails - 运行 1 次任务以在 Ruby 中将值输入数据库

ruby-on-rails - 使用 Omniauth on Rails 3 检索 Google 个人资料图片

postgresql - Postgres - 复制(去除双引号)

python - psycopg2 在 centOS 上安装失败

node.js - 模式无效,process.env 变量需要 mongodb

ruby-on-rails - rails : When the "flash" hash becomes empty?

javascript - 获取 jQuery timeago 插件以识别新加载的 DOM 元素

node.js - SequelizeDatabaseError - 缺少列 - 一对多关联