All, Many thanks for the previous help I have received from this list ... I am hoping someone can point me in the right direction here. I am attempting to bolt on a ROR admin system for an existing oscommerce store, and so far have been fairly successful. My setup is a basic oscommerce install, which is apache/php/mysql. I have abbreviated the tables to include only information relevant to my issue. Database Tables in question customers: customers_id int(11) NOT NULL auto_increment, customers_firstname varchar(32) NOT NULL, customers_default_address_id int(11) default NULL, PRIMARY KEY (customers_id) Example row in customers: customers_id = 50 customers_firstname = bob customers_default_address_id = 1 address_book: address_book_id int(11) NOT NULL auto_increment, customers_id int(11) NOT NULL, entry_firstname varchar(32) NOT NULL, entry_postcode varchar(10) NOT NULL, entry_state varchar(32) default NULL, entry_country_id int(11) NOT NULL default ''0'', entry_zone_id int(11) NOT NULL default ''0'', PRIMARY KEY (address_book_id), Example rows in the address_book table: address_book_id = 1 customers_id = 50 entry_firstname = bob entry_postcode = 45619 entry_state = Alaska entry_country_id = 223 entry_zone_id = 2 address_book_id = 11 customers_id = 50 entry_firstname = bob entry_postcode = 40000 entry_state = Alaska entry_country_id = 223 entry_zone_id = 2 zones: zone_id int(11) NOT NULL auto_increment, zone_country_id int(11) NOT NULL, zone_code varchar(32) NOT NULL, zone_name varchar(32) NOT NULL, PRIMARY KEY (zone_id), KEY idx_zones_country_id (zone_country_id) Example row in the zones table: zone_id = 2 zone_country_id = 223 (this is the US) zone_code = AK zone_name = Alaska The customers table has the name/email/basic information for a customer. The address_book table (note the non plural table name) contains multiple mailing/shipping addresses for a customer. The customers_default_address_id in the customers table denotes which is the default address to ship to. In my example, bob has two addresses in Alaska. My issue is, how can I represent this information in a collection of models such that I can use the address information properly. My existing customer model works just fine. I attempted to add an "address_book" model, but ran into some trouble with the non-plural table name plus the fact that it had an underscore. The fact that the state two letter abbreviation is actually stored in the zones table, left me a little stuck. My goal was to be able to do something like this: c = Customer.find 50 - this would find the customer record for bob - this works great. c.customers_state would return the current state of the current default address (the two letter, requiring a hit of the address_book and zones table). c.addressbooks would return a list of all the addresses for a customer. My existing solution to this problem was to create a view in mysql for my customer information and have it only use the current default address. This was going to be an OK solution, but I discovered the hosting service for my site is using a downlevel version of mysql, and views are not possible. I would be glad to share my completed mapping of rails to oscommerce when I am done if anyone is interested ... Note: I am still a newbie on rails - please tell me if this is the not the right place for this question. Thanks for any help anyone can provide. Dustin --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
This might not be exactly what you wanted, but after thinking about your situation for a while, I decided that it would be best to point you to some applicable documentation - primarily because I don''t know if I could come up with a good solution for you! For your models, you can try to use table_name (http://api.rubyonrails.com/classes/ ActiveRecord/Base.html#M001396) if you have singular/plural problems. You can also customize the inflector in config/environment.rb, I believe. For associations, you''ll need to define your classes/foreign keys since they don''t happily marry to the rails standards. Look at the :class_name and :foreign_key options to different associations (http://api.rubyonrails.com/classes/ActiveRecord/Associations/ ClassMethods.html). Sorry. I feel like I''m taking the easy way out, but others might be able to provide you with some specifics. -Kyle On Apr 13, 2:24 pm, Tubahead <dustin.tenn...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> All, > > Many thanks for the previous help I have received from this list ... I > am hoping someone can point me in the right direction here. I am > attempting to bolt on a ROR admin system for an existing oscommerce > store, and so far have been fairly successful. > > My setup is a basic oscommerce install, which is apache/php/mysql. I > have abbreviated the tables to include only information relevant to > my issue. > > Database Tables in question > customers: > customers_id int(11) NOT NULL auto_increment, > customers_firstname varchar(32) NOT NULL, > customers_default_address_id int(11) default NULL, > PRIMARY KEY (customers_id) > > Example row in customers: > customers_id = 50 > customers_firstname = bob > customers_default_address_id = 1 > > address_book: > address_book_id int(11) NOT NULL auto_increment, > customers_id int(11) NOT NULL, > entry_firstname varchar(32) NOT NULL, > entry_postcode varchar(10) NOT NULL, > entry_state varchar(32) default NULL, > entry_country_id int(11) NOT NULL default ''0'', > entry_zone_id int(11) NOT NULL default ''0'', > PRIMARY KEY (address_book_id), > > Example rows in the address_book table: > address_book_id = 1 > customers_id = 50 > entry_firstname = bob > entry_postcode = 45619 > entry_state = Alaska > entry_country_id = 223 > entry_zone_id = 2 > > address_book_id = 11 > customers_id = 50 > entry_firstname = bob > entry_postcode = 40000 > entry_state = Alaska > entry_country_id = 223 > entry_zone_id = 2 > > zones: > zone_id int(11) NOT NULL auto_increment, > zone_country_id int(11) NOT NULL, > zone_code varchar(32) NOT NULL, > zone_name varchar(32) NOT NULL, > PRIMARY KEY (zone_id), > KEY idx_zones_country_id (zone_country_id) > > Example row in the zones table: > zone_id = 2 > zone_country_id = 223 (this is the US) > zone_code = AK > zone_name = Alaska > > The customers table has the name/email/basic information for a > customer. The address_book table (note the non plural table name) > contains multiple mailing/shipping addresses for a customer. The > customers_default_address_id in the customers table denotes which is > the default address to ship to. In my example, bob has two addresses > in Alaska. > > My issue is, how can I represent this information in a collection of > models such that I can use the address information properly. > > My existing customer model works just fine. > I attempted to add an "address_book" model, but ran into some trouble > with the non-plural table name plus the fact that it had an > underscore. > The fact that the state two letter abbreviation is actually stored in > the zones table, left me a little stuck. > > My goal was to be able to do something like this: > > c = Customer.find 50 - this would find the customer record for bob - > this works great. > c.customers_state would return the current state of the current > default address (the two letter, requiring a hit of the address_book > and zones table). > c.addressbooks would return a list of all the addresses for a > customer. > > My existing solution to this problem was to create a view in mysql for > my customer information and have it only use the current default > address. This was going to be an OK solution, but I discovered the > hosting service for my site is using a downlevel version of mysql, and > views are not possible. > > I would be glad to share my completed mapping of rails to oscommerce > when I am done if anyone is interested ... > > Note: I am still a newbie on rails - please tell me if this is the not > the right place for this question. > Thanks for any help anyone can provide. > > Dustin--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
No problem ... any help at all is appreciated. I have been pondering it a bit as well, and this is a far as I have gotten. I can create a model to match the address book like this: ./script/generate model addressbook --skip-migration Then modify the model and force it to use my strange table name using the table_name option you mentioned. Changing the inflector is something I need to read a little more about, but that sounds pretty close. That gets me a list of address book entries, but I am not sure how to query my model for the default one. My guess is something like: c = Customer.find 50 @default_address_book_id = c.customers_default_address_id @default_address = c.addressbooks.find(:all, :conditions {:id @default_address_book_id} ) This still leaves me with the "zones" table, and I am still unsure how I should handle this. Let me just take another shot at this whole problem, maybe I haven''t applied enough brute force yet. Thanks for your help !! Dustin On Apr 14, 10:27 pm, Kyle <kyle.r...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> This might not be exactly what you wanted, but after thinking about > your situation for a while, I decided that it would be best to point > you to some applicable documentation - primarily because I don''t know > if I could come up with a good solution for you! For your models, you > can try to use table_name (http://api.rubyonrails.com/classes/ > ActiveRecord/Base.html#M001396) if you have singular/plural problems. > You can also customize the inflector in config/environment.rb, I > believe. For associations, you''ll need to define your classes/foreign > keys since they don''t happily marry to the rails standards. Look at > the :class_name and :foreign_key options to different associations > (http://api.rubyonrails.com/classes/ActiveRecord/Associations/ > ClassMethods.html). > > Sorry. I feel like I''m taking the easy way out, but others might be > able to provide you with some specifics. > > -Kyle > > On Apr 13, 2:24 pm, Tubahead <dustin.tenn...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > All, > > > Many thanks for the previous help I have received from this list ... I > > am hoping someone can point me in the right direction here. I am > > attempting to bolt on a ROR admin system for an existing oscommerce > > store, and so far have been fairly successful. > > > My setup is a basic oscommerce install, which is apache/php/mysql. I > > have abbreviated the tables to include only information relevant to > > my issue. > > > Database Tables in question > > customers: > > customers_id int(11) NOT NULL auto_increment, > > customers_firstname varchar(32) NOT NULL, > > customers_default_address_id int(11) default NULL, > > PRIMARY KEY (customers_id) > > > Example row in customers: > > customers_id = 50 > > customers_firstname = bob > > customers_default_address_id = 1 > > > address_book: > > address_book_id int(11) NOT NULL auto_increment, > > customers_id int(11) NOT NULL, > > entry_firstname varchar(32) NOT NULL, > > entry_postcode varchar(10) NOT NULL, > > entry_state varchar(32) default NULL, > > entry_country_id int(11) NOT NULL default ''0'', > > entry_zone_id int(11) NOT NULL default ''0'', > > PRIMARY KEY (address_book_id), > > > Example rows in the address_book table: > > address_book_id = 1 > > customers_id = 50 > > entry_firstname = bob > > entry_postcode = 45619 > > entry_state = Alaska > > entry_country_id = 223 > > entry_zone_id = 2 > > > address_book_id = 11 > > customers_id = 50 > > entry_firstname = bob > > entry_postcode = 40000 > > entry_state = Alaska > > entry_country_id = 223 > > entry_zone_id = 2 > > > zones: > > zone_id int(11) NOT NULL auto_increment, > > zone_country_id int(11) NOT NULL, > > zone_code varchar(32) NOT NULL, > > zone_name varchar(32) NOT NULL, > > PRIMARY KEY (zone_id), > > KEY idx_zones_country_id (zone_country_id) > > > Example row in the zones table: > > zone_id = 2 > > zone_country_id = 223 (this is the US) > > zone_code = AK > > zone_name = Alaska > > > The customers table has the name/email/basic information for a > > customer. The address_book table (note the non plural table name) > > contains multiple mailing/shipping addresses for a customer. The > > customers_default_address_id in the customers table denotes which is > > the default address to ship to. In my example, bob has two addresses > > in Alaska. > > > My issue is, how can I represent this information in a collection of > > models such that I can use the address information properly. > > > My existing customer model works just fine. > > I attempted to add an "address_book" model, but ran into some trouble > > with the non-plural table name plus the fact that it had an > > underscore. > > The fact that the state two letter abbreviation is actually stored in > > the zones table, left me a little stuck. > > > My goal was to be able to do something like this: > > > c = Customer.find 50 - this would find the customer record for bob - > > this works great. > > c.customers_state would return the current state of the current > > default address (the two letter, requiring a hit of the address_book > > and zones table). > > c.addressbooks would return a list of all the addresses for a > > customer. > > > My existing solution to this problem was to create a view in mysql for > > my customer information and have it only use the current default > > address. This was going to be an OK solution, but I discovered the > > hosting service for my site is using a downlevel version of mysql, and > > views are not possible. > > > I would be glad to share my completed mapping of rails to oscommerce > > when I am done if anyone is interested ... > > > Note: I am still a newbie on rails - please tell me if this is the not > > the right place for this question. > > Thanks for any help anyone can provide. > > > Dustin--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Maybe create a view that ''looks right to rails'' and maps back to your real db? -- Posted via http://www.ruby-forum.com/. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
That was my first thought, but I am stuck with mysql 4.x, which doesn''t have views as a feature. That comes in mysql5. I had considered doing a very wasteful cron script to build me a corrected table to query on, but it seemed better to stick with an actual fix or a view. Dustin On Apr 15, 3:02 am, Roger Pack <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:> Maybe create a view that ''looks right to rails'' and maps back to your > real db? > -- > Posted viahttp://www.ruby-forum.com/.--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
OK ... I have made some progress, it was somewhat easier than I thought. Customer Model: class Customer < ActiveRecord::Base set_table_name ''rscustomers'' set_primary_key :customers_id has_many :addressbooks, :foreign_key => "customers_id" end Addressbook Model: class Addressbook < ActiveRecord::Base set_table_name ''address_book'' set_primary_key ''address_book_id'' belongs_to :customer ## The following line is WRONG, not sure just how to fix it yet. has_one :zone, :foreign_key => "zone_id" end Zone Model: class Zone < ActiveRecord::Base end So, here is what works so far. c = Customer.find 50 ## Works great, get back the correct customer. a = c.addressbooks.find(:first) -- returns the first address book entry for a customer ## Works great, returns the correct address books for the customer a.zone => nil ## This is my current failure point, and I see the issue but haven''t found how to fix it yet. ## There is a record that matches From my development.log: Addressbook Columns (0.002975) SHOW FIELDS FROM `address_book` Zone Load (0.000500) SELECT * FROM `zones` WHERE (zones.zone_id 50) LIMIT 1 When attempting to find the zone information for my address book entry, the model is querying from the zones table where the zone_id customers id. Note again the table structure: customers: address_book_id = 1 customers_id = 50 entry_firstname = bob entry_postcode = 45619 entry_state = Alaska entry_country_id = 223 entry_zone_id = 2 zones: zone_id int(11) NOT NULL auto_increment, zone_country_id int(11) NOT NULL, zone_code varchar(32) NOT NULL, zone_name varchar(32) NOT NULL, PRIMARY KEY (zone_id), KEY idx_zones_country_id (zone_country_id) The query should be trying to find the zone in the zone table where the entry_zone_id = zone_id. I am reading through the active record docs to see if I can figure it out .... Dustin On Apr 15, 9:41 am, Tubahead <dustin.tenn...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> That was my first thought, but I am stuck with mysql 4.x, which > doesn''t have views as a feature. That comes in mysql5. I had > considered doing a very wasteful cron script to build me a corrected > table to query on, but it seemed better to stick with an actual fix or > a view. > > Dustin > > On Apr 15, 3:02 am, Roger Pack <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> > wrote: > > > Maybe create a view that ''looks right to rails'' and maps back to your > > real db? > > -- > > osted viahttp://www.ruby-forum.com/.--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Got it ... here are my completed model definitions: class Addressbook < ActiveRecord::Base set_table_name ''address_book'' set_primary_key ''address_book_id'' belongs_to :customer belongs_to :zone, :foreign_key => "entry_zone_id" end class Customer < ActiveRecord::Base set_table_name ''rscustomers'' set_primary_key :customers_id has_many :addressbooks, :foreign_key => "customers_id" end class Zone < ActiveRecord::Base set_primary_key "zone_id" has_many :addressbooks, :foreign_key => "entry_zone_id" end Thanks for the help, I will try to repay in kind as I get a little more experience. Dustin On Apr 15, 8:54 pm, Tubahead <dustin.tenn...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> OK ... I have made some progress, it was somewhat easier than I > thought. > > Customer Model: > class Customer < ActiveRecord::Base > set_table_name ''rscustomers'' > set_primary_key :customers_id > has_many :addressbooks, :foreign_key => "customers_id" > end > > Addressbook Model: > class Addressbook < ActiveRecord::Base > set_table_name ''address_book'' > set_primary_key ''address_book_id'' > belongs_to :customer > ## The following line is WRONG, not sure just how to fix it yet. > has_one :zone, :foreign_key => "zone_id" > end > > Zone Model: > class Zone < ActiveRecord::Base > > end > > So, here is what works so far. > c = Customer.find 50 > ## Works great, get back the correct customer. > > a = c.addressbooks.find(:first) -- returns the first address book > entry for a customer > ## Works great, returns the correct address books for the customer > > a.zone > => nil > ## This is my current failure point, and I see the issue but haven''t > found how to fix it yet. > ## There is a record that matches > > From my development.log: > Addressbook Columns (0.002975) SHOW FIELDS FROM `address_book` > Zone Load (0.000500) SELECT * FROM `zones` WHERE (zones.zone_id > 50) LIMIT 1 > > When attempting to find the zone information for my address book > entry, the model is querying from the zones table where the zone_id > customers id. > > Note again the table structure: > > customers: > address_book_id = 1 > customers_id = 50 > entry_firstname = bob > entry_postcode = 45619 > entry_state = Alaska > entry_country_id = 223 > entry_zone_id = 2 > > zones: > zone_id int(11) NOT NULL auto_increment, > zone_country_id int(11) NOT NULL, > zone_code varchar(32) NOT NULL, > zone_name varchar(32) NOT NULL, > PRIMARY KEY (zone_id), > KEY idx_zones_country_id (zone_country_id) > > The query should be trying to find the zone in the zone table where > the entry_zone_id = zone_id. > > I am reading through the active record docs to see if I can figure it > out .... > > Dustin > > On Apr 15, 9:41 am, Tubahead <dustin.tenn...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > That was my first thought, but I am stuck with mysql 4.x, which > > doesn''t have views as a feature. That comes in mysql5. I had > > considered doing a very wasteful cron script to build me a corrected > > table to query on, but it seemed better to stick with an actual fix or > > a view. > > >Dustin > > > On Apr 15, 3:02 am, Roger Pack <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> > > wrote: > > > > Maybe create a view that ''looks right to rails'' and maps back to your > > > real db? > > > -- > > > osted viahttp://www.ruby-forum.com/.--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---