Can anyone explain why the following shows that when you dynamically
create an Active::Record object, the accessors/mutators for the columns
are not created? Very puzzled! Thanks :o)
klass = Class.new(ActiveRecord::Base) do
set_table_name table_name
end
Kernel.const_set(model_class_name, klass)
puts "Created the model class and set as a constant."
column_names = model_class.columns.map{ |x| x.name }
methods = model_class_name.constantize.new.methods
raise "Columns not in instance as methods\n\n"+
"Columns:\n\n#{column_names.sort.join("\n")}\n\n"+
"Instance Methods:\n\n#{methods.sort.join("\n")}"
if methods & column_names != column_names
Can anyone explain why the following shows that when you dynamically
create an Active::Record object, the accessors/mutators for the columns
are not created? Very puzzled! Thanks :o)
Try it with a ‘normal’ AR object - doesn’t work either. Attribute
getters/setters are handled by method_missing, which defines instance
methods at runtime for speed.
Otherwise, Object.const_set :Person, Class.new(ActiveRecord::Base) is
plenty.
Can anyone explain why the following shows that when you dynamically
create an Active::Record object, the accessors/mutators for the columns
are not created? Very puzzled! Thanks :o)
I’m not sure what’s wrong with the code you listed, but here’s a module
I
use to create dynamic active record objects.
module Stone
module Dynamic
class << self
def klass(table_name)
tname = class_name_from_table(table_name) #see if it has already been defined
const_missing(tname)
rescue NameError
define_klass(table_name)
end
def objeck(table_name)
klass(table_name).new
end
private
def class_name_from_table(table_name)
Inflector.camelize(table_name)
end
def define_klass(table_name)
tname = class_name_from_table(table_name)
class_def = <<-end_eval
class #{tname} < ActiveRecord::Base
set_table_name('#{table_name}')
end
end_eval
eval(class_def, TOPLEVEL_BINDING)
const_get(tname)
end
end