Forum: Ruby on Rails mapping column names in legacy schemata

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
5a785c03c08d7de6a15aaea326835cd6?d=identicon&s=25 tilo (Guest)
on 2007-04-27 01:22
(Received via mailing list)
I have a legacy MySQL database with a weird naming convention - all
table and column
names have a prefix '_' ,  which is annoying, and some of the column
names are misnomers.

I would like to apply a pre-defined mapping between MySQL column names
and method
names to be used in the Ruby class, without having the original column
names being visible anymore.

 how can I pre-define a static mapping of all (legacy) column names to
different Class method names?

e.g.: given legacy schema:

Table _fix has columns:
   _job
   _ change
   _date
   _effect

When defining the Ruby class, I'd like to do something like this:

class Fix < ActiveRecord::Base
   self.table_name = "_fix"
   use_mapping (                    # imaginary construct..
       :_job => "job_id",
       :_change => "change_id" ,
       :_date => "date" ,
       :_effect => "status")

   self.primary_key = "job_id"
end

and want to access it like this:

Fix.find( id ).status = "partial fix"

which should acces the
Is there a way to do this?

thanks

   Tilo
7223c62b7310e164eb79c740188abbda?d=identicon&s=25 Xavier Noria (Guest)
on 2007-04-27 01:59
(Received via mailing list)
On Apr 27, 2007, at 1:22 AM, tilo wrote:
> class Fix < ActiveRecord::Base

>    self.table_name = "_fix"
>    use_mapping (                    # imaginary construct..
>        :_job => "job_id",
>        :_change => "change_id" ,
>        :_date => "date" ,
>        :_effect => "status")


You could add this somewhere, for instance in environment.rb:

   class ActiveRecord::Base
     def self.map_column(legacy, nice)
       class_eval <<-EOS
         def #{nice}
           #{legacy}
         end

         def #{nice}=(val)
           self.#{legacy} = val
         end
       EOS
     end
   end

The usage is

   class Model < ActiveRecord::Base
     map_column :_job, :job_id
     map_column :_change, :change_id
     ...
   end

You see the technique in case you prefer another kind of macro. BTW,
that cannot be based on alias_method because AR accessors are not
defined by then.

-- fxn
This topic is locked and can not be replied to.