Hello all, In my Rails app I have a model which I want to use to maintain records in several tables (identical structure) in multiple databases. Is there a way to use establish_connection and set_table_name in a dynamic way? -- 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 -~----------~----~----~----~------~----~------~--~---
Yes, there is. establish_connection and _not_ set_table_name is the answer. I''ve been down both routes and establish_connection is much lighter on the necessary code than set_table_name. RSL On 5/9/07, Patrick Baselier <rails-mailing-list-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:> > > Hello all, > > In my Rails app I have a model which I want to use to maintain records > in several tables (identical structure) in multiple databases. > Is there a way to use establish_connection and set_table_name in a > dynamic way? > > -- > 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 -~----------~----~----~----~------~----~------~--~---
Russell Norris wrote:> Yes, there is. establish_connection and _not_ set_table_name is the > answer. > I''ve been down both routes and establish_connection is much lighter on > the > necessary code than set_table_name. > > RSLHi RSL, Thanks for answering. However, I think I need both set_table_name and establish_connection I want to access multiple tables on multiple databases. Maybe I can overload the ActiveRecord class methods create, save, etc. by defining extra parameters for both connection and table_name: <code> def self.create(attributes, connection, table_name) set_table_name = table_name establish_connection connection super(attributes) end </code> but I haven''t tried this appraach yet. -- 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 -~----------~----~----~----~------~----~------~--~---
Here''s what I did. Site model is in the default db and contains a db_name attribute which holds the name of the db for that site. In Site... DB_PREFIX = "whatever_" def ensure_connection [Attachment, Document, Category, Tag].each do |klass| unless ActiveRecord::Base.configurations.has_key? db_name config = ActiveRecord::Base.configurations[RAILS_ENV] ActiveRecord::Base.configurations[db_name] = { :adapter => "mysql", :host => config["host"], :username => config["username"], :password => config["password"], :database => "#{DB_PREFIX}#{db_name}" } end [Attachment, Category, Comment, Document, Tag, Source].each do |model| if model.connection.config[:database] != "#{DB_PREFIX}#{db_name}" model.establish_connection db_name # You have to do this manually... model.connection.logger = RAILS_DEFAULT_LOGGER end end end end and in my controllers that need to access that data just create a before_filter which calls Site#ensure_connections. Unless you''re on to something I wasn''t set_table_name is more trouble than it''s worth. Hope that helps. RSL On 5/9/07, Patrick Baselier <rails-mailing-list-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:> > > Russell Norris wrote: > > Yes, there is. establish_connection and _not_ set_table_name is the > > answer. > > I''ve been down both routes and establish_connection is much lighter on > > the > > necessary code than set_table_name. > > > > RSL > > Hi RSL, > > Thanks for answering. However, I think I need both set_table_name and > establish_connection I want to access multiple tables on multiple > databases. Maybe I can overload the ActiveRecord class methods create, > save, etc. by defining extra parameters for both connection and > table_name: > <code> > def self.create(attributes, connection, table_name) > set_table_name = table_name > establish_connection connection > super(attributes) > end > </code> > but I haven''t tried this appraach yet. > > -- > 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 -~----------~----~----~----~------~----~------~--~---
I figured out that it''s actually pretty easy to set connection and tablename dynamically by using establish_connection and set_table_name for my model only: ... Site.establish_connection some_method Site.set_table_name another_method Site.create (or whatever class method) In my situation I want to update several MSSQL records on several servers. The default database is mySQL. However... since I use the RedHill lpugin (http://www.redhillonrails.org/#redhillonrails_core) it seems that there is a conflict when I try to create or update on MSSQL when my default connection connects to mySQL: NoMethodError: undefined method `[]='' for #<Mysql> from c:/DEV/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.2/lib/active_record/connection_adapters/sqlserver_adapter.rb:439:in `indexes'' from ./script/../config/../config/../vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/base.rb:42:in `indexes'' from ./script/../config/../config/../vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/base.rb:27:in `columns'' from c:/DEV/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.2/lib/active_record/base.rb:776:in `column_names'' from c:/DEV/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.2/lib/active_record/base.rb:789:in `column_methods_hash'' from c:/DEV/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.2/lib/active_record/base.rb:1263:in `all_attributes_exists?'' from (irb):9:in `all?'' from c:/DEV/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.2/lib/active_record/base.rb:1263:in `each'' from c:/DEV/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.2/lib/active_record/base.rb:1263:in `all?'' from c:/DEV/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.2/lib/active_record/base.rb:1263:in `all_attributes_exists?'' from c:/DEV/ruby/lib/ruby/gems/1.8/gems/activerecord-1.15.2/lib/active_record/base.rb:1197:in `method_missing'' from (irb):9 The story continues, but thanks for the reply! Patrick -- 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 -~----------~----~----~----~------~----~------~--~---