3

rails 3.2.3、ruby 1.9.3、postgres 8.4.12 (RHEL 6.3) を使用しています。IP アドレスを整数としてデータベースに保存することを望んでいましたが、コントローラーからレコードを保存しようとすると、次のエラーが発生します。

  def create
    @network = Network.new(params[:network])

    @network.address_int = IPAddr.new(@network.address_str).to_i
    @network.netmask_int = IPAddr.new(@network.netmask_str).to_i

    respond_to do |format|
      if @network.save
        format.html { redirect_to @network, notice: 'Network was successfully created.' }
        format.json { render json: @network, status: :created, location: @network }
      else
        format.html { render action: "new" }
        format.json { render json: @network.errors, status: :unprocessable_entity }
      end
    end
  end

次のエラーが表示されます

PG::Error: ERROR:  value "4294967040" is out of range for type integer

私の移行では、この列を 8 バイトの整数として定義しています。

class CreateNetworks < ActiveRecord::Migration
  def change
    create_table :networks do |t|
      t.integer :vlan
      t.integer :address_int, :limit => 8      
      t.integer :netmask_int, :limit => 8
      t.string :address_str
      t.string :netmask_str
      t.string :desc

      t.timestamps
    end
  end
end

しかし、この大きな整数を Rails コンソールに保存することができました。

1.9.3p125 :001 > n=Network.new
 => #<Network id: nil, vlan: nil, address_int: nil, address_str: nil, netmask_int: nil, netmask_str: nil, desc: nil, created_at: nil, updated_at: nil>
1.9.3p125 :002 > n.address_int=4294967040
 => 4294967040
1.9.3p125 :003 > n
 => #<Network id: nil, vlan: nil, address_int: 4294967040, address_str: nil, netmask_int: nil, netmask_str: nil, desc: nil, created_at: nil, updated_at: nil>
1.9.3p125 :004 > n.save
(0.2ms)  BEGIN
  SQL (5.0ms)  INSERT INTO "networks" ("address_int", "address_str", "created_at", "desc", "netmask_int", "netmask_str", "updated_at", "vlan") VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING "id"  [["address_int", 4294967040], ["address_str", nil], ["created_at", Tue, 10 Jul 2012 15:09:37 UTC +00:00], ["desc", nil], ["netmask_int", nil], ["netmask_str", nil], ["updated_at", Tue, 10 Jul 2012 15:09:37 UTC +00:00], ["vlan", nil]]
(0.9ms)  COMMIT
 => true

では、この bigint データ型も別の場所で定義する必要がありますか? 前もって感謝します。

4

1 に答える 1

4

PG 9.1 にアップグレードすると、ネイティブIP アドレス/サブネット/MAC アドレス タイプを使用できます。postgres_ext gemを使用して、移行でそれらを使用することもできます。これにより、BIGINT または STRING としてキャストすることなく、任意のタイプの IP アドレスが自動的に処理され、「SELECT FROM * IN SAME SUBNET」などの素晴らしいトリックが可能になります。

于 2012-07-21T15:41:32.550 に答える