On Oct 21, 4:18 pm, Jeremy Evans <[email protected]> wrote:
> On Oct 21, 2:42 pm, "sam.rawlins" <[email protected]> wrote:
>
>
>
>
>
>
>
>
>
> > Similar 
> > tohttp://groups.google.com/group/sequel-talk/browse_thread/thread/8f343...
> > but I don't have a scheme for pairing a DB column name and a
> > Sequel::Model's or Dataset's key.
>
> > I'm using a legacy database with horrible, old table names and column
> > names. Table names can be fixed with set_dataset (grep for set_dataset
> > onhttp://sequel.rubyforge.org/rdoc/files/README_rdoc.html).
>
> > Column names, however, are completely arbitrary. For examples:
> >     I want :vendor_name to map to the VNDR_NM column,
> >     I want :vendor_duns_number to map to the VNDR_DUNS_NBR column,
> >     I want :vendor_payment_terms_code to map to the VNDR_PMT_TERM_CD
> > column.
>
> > In this way I could call Vendor.filter(:vendor_name => 'IBM') to
> > access VNDR_T where VNDR_NM = 'IBM'
>
> > So these would have to be pulled from a configuration file or some
> > such (This is in fact how the java web app that uses the database maps
> > to the crazy-name columns: with many lengthy XML files. The fun
> > configuration-over-convention method :) ).
>
> > I can worry about that side of this problem. I just want something
> > similar to Sequel::Model#set_dataset for column names.
>
> You would have to use an identifier_input_method to do the column
> translation from vendor_name to VNDR_NM in the dataset.  And usually,
> you would want a similar identifier_output_method that takes VNDR_NM
> and returns vendor_name.
>
> There a a two usual ways to do this (you could also use a combination
> of the two):
>
>   DB.identifier_input_method = :legacy_db_in
>   DB.identifier_output_method = :legacy_db_out
>
>   # Configuration Way
>   LEGACY_DB_IN = {'vendor_name'=>'VNDR_NM', ...}
>   LEGACY_DB_OUT = LEGACY_DB_IN.invert
>   class String
>     def legacy_db_in
>       LEGACY_DB_IN.fetch(self, self)
>     end
>     def legacy_db_out
>       LEGACY_DB_OUT.fetch(self, self)
>     end
>   end
>
>   # Convention Way
>   LEGACY_DB_IN = {'name'=>'NM', 'vendor'=>'VNDR', 'number'=>'NBR',
>     'payment'=>'PMT', 'terms'=>'TERM', 'code'=>'CD', ...}
>   LEGACY_DB_OUT = LEGACY_DB_IN.invert
>   class String
>     def legacy_db_in
>       self.gsub(/[^_]+/){|s| LEGACY_DB_IN[s] || s.upcase}
>     end
>     def legacy_db_out
>       self.gsub(/[^_]+/){|s| LEGACY_DB_OUT[s] || s.downcase}
>     end
>   end
>
> Jeremy

OK this makes sense. So identifier_input_method is defined against DB
(a Sequel.oracle in my case)... Because I don't think the
instance_variable (key) maps to the same column name for all classes
(tables). So it'd be very fancy if I could have different
identifier_input_methods for each dataset...

EG Vendor.addressLine1 might map to ADDR_LN_1 and
 Customer.addressLine1 might map to ADDR_LINE_1

But I'll get creative... Thanks Jeremy!

-- 
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sequel-talk?hl=en.

Reply via email to