On Oct 21, 4:53 pm, "sam.rawlins" <[email protected]> wrote:
> 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!
On second thought, my creative solution might involve overriding
Sequel::Dataset which is currently:
def input_identifier(v)
(i = identifier_input_method) ? v.to_s.send(i) : v.to_s
end
Grepping the source for 'identifier_input_method', this is the only
place where I see the an object being sent identifier_input_method.
--
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.