6

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 とサブネットを 1 つのフィールドに格納するのに適した方法でした。現在、Rails (4.0.1) と Ruby (2.0.0 p247) で inet 型を使用していますが、読んで試したところ、Rails はそれを IPAddr オブジェクトに変換します。しかし、この IPAddr オブジェクトは私の形式を破壊しています。上記の 4 つの例を次のように変換します。

 192.168.1.0/30

Railsがそれを行うのを防ぐ方法はありますか、それとも文字列に置き換える方法はありますか? それとも別の宝石?

何かを保存しようとすると、データベースから既存の値を読み取ろうとしたときにも問題が発生します。

より細かくするために:

 IPAddr.new("192.168.1.2/255.255.255.252") 

データベース エントリを作成します。

 192.168.1.0/24
4

1 に答える 1

3

私の記憶が正しければ、192.168.1.0/30技術的には正しいです。

役立つ可能性のあるいくつかのことを次に示します。

  • IPAddr に加えて、IPv4 および IPv6 を操作するための非常に優れた gem はIPAddressです。Active Record がすでに値を IPAddr に渡しており、値が変更されている場合はあまり役に立ちません。そのため、代わりに IPAddress を使用するように Active Record に指示する必要があります。
  • 組み込みの IP 関数を介してサブネット化のニーズを処理するために PostgreSQL を使用する場合は、アドレスを PostgreSQL の「inet」タイプとして保存しても問題ありません。お気づきのように、単純に IP アドレスを保存して取得したい場合は、悪い考えです。Active Record はフィールド タイプを尊重し、それを最も近い Ruby クラスである IPAddr にマップしようとします。代わりに、IP を、必要な形式で高速に取得するための文字列と、適切なサイズの整数の両方として常に保存しているため、すべてのサブネット操作と一致をバイナリで実行できます。

    クエリで、値を Active Record に返す前に文字列にキャストするように PostgreSQL に指示すると、役立つ場合があります。その時点で、 IPAddress を使用して、解析後に値を操作できます。Active Record にどのように PostgreSQL にそれを行うように指示するかは別の問題です。

于 2014-03-31T22:39:27.843 に答える