私はモデルDownload
とテーブルを持っていますdownloads
。には、IP アドレスを整数として格納するdownloads
というフィールドがあります。ip_address
モデルをセットアップしたいのですIpAddress
が、ip_addresses テーブルがないので、次のようなことができます
Download.find(1).ip_address.to_s # '127.0.0.1'
Download.find(1).ip_address.to_i # 2130706433
Download.find(1).ip_address.downloads # SELECT * FROM downloads WHERE ip_address='2130706433'
IpAddress.find(2130706433).downloads # SELECT * FROM downloads WHERE ip_address='2130706433'
次のように動作させたい:
class Download < ActiveRecord::Base
belongs_to :ip_address, :foreign_key => :ip_address
end
class IpAddress < ActiveRecord::Base
set_primary_key :ip_address
has_many :downloads, :foreign_key => :ip_address
end
しかし、無駄な IP アドレスのテーブルはありません。
これは可能ですか?
編集
ruby にはすでにIPAddr クラスがあることがわかりました。
だから私はこれをしました:
require 'ipaddr'
class Download < ActiveRecord::Base
attr_accessible :ip, ...
def ip
@ip ||= IPAddr.new(read_attribute(:ip), Socket::AF_INET)
end
def ip=(addr)
@ip = IPAddr.new(addr, Socket::AF_INET)
write_attribute(:ip, @ip.to_i)
end
def self.for_ip(addr)
where(:ip => IPAddr.new(addr, Socket::AF_INET).to_i)
end
end
それから私はたくさんのクールなことをすることができます
Download.new(:ip => '127.0.0.1').save
Download.for_ip('127.0.0.1').first.ip.to_i # 2130706433