Hey everyone,
I’ve got a facade column set up in 2 of my models. Specifically, I’m
storing an IPv4 address as a 32-bit integer in my database and my model
is set up to only return the IP in dotted notation (ie: 176942002 ->
‘10.139.235.178’).
Since I’m using this in more than one place, and I may use it in another
project as well, I’d like to somehow make a plugin or at the very least
extend my ApplicationController with a function to automatically handle
this.
I’d like it to work something like this:
class SomeController < ApplicationController
ipv4_address :ip_address
end
where :ip_address is the name of the column that I’d like to create the
facade.
is there any way of doing this?
Thanks!
…spike
Hi Spike,
Certainly you can. Best idea is to create yourself a plug-in with
something like:
module MyPlugin
def self.append_features(base)
base.extend ClassMethods
end
module ClassMethods
def ipv4_address field
class_eval do
define_method field.to_sym do
# code here to return the address
end
end
end
end
end
ActiveRecord::Base.class_eval do
include MyPlugin
end
This should allow you to do:
class Testing < ActiveRecord::Base
ipv4_address :me
end
t = Testing.new
t.me
Thanks, Dave!
I’ve got limited experience with using modules and mixins in Ruby, so…
Currently, I implement 3 methods for each column:
ip_address
ip_address=
ip_address_before_typecast
if I were to do the above call to “ipv4_address :my_column” and wanted
to get definitions for my_column, my_column=, and
my_column_before_typecast, how I would I do that?
I think I understand the rest of what you said. I’m going to attempt an
implementation, now.
thanks, again.
…spike
Excerpts from Gianmarco P.'s message of Tue Oct 16 19:10:29
+0100 2007:
…spike
Hi Spike,
The define_method creates the method so add more ie:
module MyPlugin
def self.append_features(base)
base.extend ClassMethods
end
module ClassMethods
def ipv4_address field
class_eval do
define_method field.to_sym do
# code here to return the address
end
define_method "#{field}_before_type_case".to_sym do
# code here to return the value before type case
end
end
end
end
I’m having one more issue with this. Having never worked with Rails
plugins before, I must just be forgetting to do something simple.
I created a new plugin using “script/generate plugin Ipv4Address”
I then edited ‘lib/ipv4_address.rb’ to contain the following:
=============START============
Ipv4Address
module Ipv4Address
def self.append_features(base)
base.extend ClassMethods
end
module ClassMethods
def ipv4_address field
class_eval do
define_method field.to_sym do
IPAddress.to_ip read_attribute(field)
end
define_method "#{field}=".to_sym do |new_ip|
write_attribute field, IPAddress.to_int(new_ip)
end
define_method "#{field}_before_type_cast".to_sym do
field ##is this right?
end
end
end
end
end
============END=============
and init.rb contains:
=========START=========
ActiveRecord::Base.class_eval do
include Ipv4Address
end
=========END===========
When I set up my ActiveRecord class to use:
ipv4_address :start_ip
I get the following error:
undefined method `ipv4_address’ for DhcpBlock:Class
am I missing something?
Thanks!
…spike