Can't dynamically create an Acitve::Record object

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

On 9/19/06, Matthew P. [email protected] wrote:

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.

jeremy

On 9/19/06, Matthew P. [email protected] wrote:

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

end
end

Hope this is of some use,
andy


Andrew S.

Thanks guys!

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs