Gerald Anderson
2011-Apr-13 01:13 UTC
Rails habtm grief am I dumb or rails bug? (desperate ; )
Greetings all, I''m having a weird problem with a habtm relationship and honestly I''m beginning to think I may have stumbled upon some weird bug in rails 3. Surely I''m crazy though. I''ve been beating my head against the wall on this for 3 days, have googled everything under the sun I can think of and still can''t come up with an answer. Ok, the situation: I''m creating a Rails app to replace both a Java app and a PHP app (java application and php front-end). This is going to be a phased operation with the first phase being the Rails application takes over registration and billing. In order to do this, the Rails application must create data in the databases for the Java and PHP apps. The Rails application itself is using Devise for authentication. In database.yml I have my standard 3 databases defined and also a connection defined for the Java apps database. Here are pieces of the model definitions for the external object (I''m just creating regular rails models to talk to the external databases): class Pushbroom::UserAccount < ActiveRecord::Base require ''digest/md5'' require ''base64'' establish_connection :pushbroom set_table_name :user_account set_primary_key :id has_and_belongs_to_many :user_roles, :join_table => ''pb_prod.users_roles'', :class_name => ''Pushbroom::UserRole'', :foreign_key => ''user_account_id'', :association_foreign_key => ''user_role_id'' belongs_to :user, :dependent => :destroy attr_accessible :user_roles, :admin_notes, :enabled, :username, :password_hash, :prefStore, :accepted_tos, :do_not_contact end class Pushbroom::UserRole < ActiveRecord::Base establish_connection :pushbroom set_table_name :user_role set_primary_key :id has_and_belongs_to_many :user_accounts, :join_table => ''pb_prod.users_roles'', :class_name => ''Pushbroom::UserAccount'', :foreign_key => ''user_role_id'', :association_foreign_key => ''user_account_id'' end And finally my Rails application user object: class User < ActiveRecord::Base before_validation :capture_plaintext_password, :on => :create before_save :create_pushbroom_user_data after_save :send_welcome_email # Include default devise modules. Others available are: # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable belongs_to :pb_user_account, :class_name => "Pushbroom::UserAccount", :foreign_key => "pb_user_account_id", :dependent => :destroy, :autosave => true # Setup accessible (or protected) attributes for your model attr_accessible :first_name, :last_name, :username, :dob, :email, :password, :password_confirmation, :remember_me validates_presence_of :first_name, :last_name, :username, :dob validates_date :dob, :on_or_after => lambda { 100.years.ago }, :on_or_after_message => "must be on or after #{100.years.ago.strftime(''%m-%d-%Y'')}" validates_date :dob, :on_or_before => lambda { 13.years.ago }, :on_or_before_message => "must be on or before #{13.years.ago.strftime(''%m-%d-%Y'')}" def capture_plaintext_password @plaintext_password = self.password end def create_pushbroom_user_data pb_user = create_pushbroom_user add_trial_subscription_to_pb_user(pb_user) pb_user_account = create_pushbroom_user_account(pb_user) add_subscription_plan_roles_to_pb_user_account(pb_user_account) self.pb_user_account = pb_user_account end def create_pushbroom_user pb_user = Pushbroom::User.new pb_user.attributes = self.attributes.slice( "email", "first_name", "last_name", "dob") pb_user end def add_trial_subscription_to_pb_user(pb_user) subscription = Pushbroom::Subscription.new subscription.populate_from_subscription_plan(Pushbroom::SubscriptionPlan.find_by_name("TRIAL")) pb_user.subscriptions << subscription end def add_subscription_plan_roles_to_pb_user_account(pb_user_account) roles_granted pb_user_account.user.subscriptions.first.subscription_plan.roles_granted pb_user_account.user_roles = roles_granted end def create_pushbroom_user_account(pb_user) pb_user_account = Pushbroom::UserAccount.new pb_user_account.enabled = true pb_user_account.password_hash Pushbroom::UserAccount.create_password_digest(@plaintext_password, self.username) pb_user_account.username = self.username pb_user_account.user = pb_user pb_user_account end def send_welcome_email AccountMailer.welcome(self).deliver end end Seems like it should be pretty vanilla. The ONLY weirdness here is that they aren''t in the native rails database and one of the fields is named funny in the relations table. So here''s a rails console session where I create a rails user, call the method to create the external objects, then try to save: ruby-1.9.2-p180 :001 > def user_fred ruby-1.9.2-p180 :002?> { ruby-1.9.2-p180 :003 > :first_name => "Fred", ruby-1.9.2-p180 :004 > :last_name => "Flinstone", ruby-1.9.2-p180 :005 > :username => "fflint", ruby-1.9.2-p180 :006 > :dob => "1986-06-01", ruby-1.9.2-p180 :007 > :email => "fred-3Q2Tfjf0mexg9hUCZPvPmw@public.gmane.org", ruby-1.9.2-p180 :008 > :password => "badpass" ruby-1.9.2-p180 :009?> } ruby-1.9.2-p180 :010?> end => nil ruby-1.9.2-p180 :011 > user = User.new(user_fred) => #<User id: nil, email: "fred-3Q2Tfjf0mexg9hUCZPvPmw@public.gmane.org", encrypted_password: "$2a$10$IiEOEoSnXIrP7VJAQYckfOVXuzm7Y5ZGo20ayLpSkHhz...", reset_password_token: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: nil, updated_at: nil, first_name: "Fred", last_name: "Flinstone", username: "fflint", dob: "1986-06-01", pb_user_account_id: nil> ruby-1.9.2-p180 :012 > user.create_pushbroom_user_data => #<Pushbroom::UserAccount id: nil, created_by: nil, created_at: nil, updated_by: nil, updated_at: nil, admin_notes: nil, enabled: true, username: "fflint", password_hash: "blah blah", user_id: nil, prefStore: nil, accepted_tos: nil, do_not_contact: nil> ruby-1.9.2-p180 :013 > user.pb_user_account.user_roles => [#<Pushbroom::UserRole id: 1, created_by: "script", created_at: "2008-11-10 12:10:44", updated_by: "script", updated_at: "2008-11-10 12:10:44", admin_notes: "", name: "user", description: "Generic User Role", conditional: false>] ruby-1.9.2-p180 :014 > user.save! NoMethodError: undefined method `relation'' for nil:NilClass from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activesupport-3.0.5/lib/active_support/whiny_nil.rb:48:in `method_missing'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/arel-2.0.9/ lib/arel/insert_manager.rb:22:in `insert'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/arel-2.0.9/ lib/arel/crud.rb:26:in `insert'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activerecord-3.0.5/lib/active_record/associations/ has_and_belongs_to_many_association.rb:76:in `insert_record'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activerecord-3.0.5/lib/active_record/associations/association_proxy.rb: 151:in `send'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activerecord-3.0.5/lib/active_record/autosave_association.rb:306:in `block in save_collection_association'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activerecord-3.0.5/lib/active_record/associations/ association_collection.rb:431:in `block in method_missing'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activerecord-3.0.5/lib/active_record/associations/association_proxy.rb: 216:in `block in method_missing'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activerecord-3.0.5/lib/active_record/associations/association_proxy.rb: 216:in `each'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activerecord-3.0.5/lib/active_record/associations/association_proxy.rb: 216:in `method_missing'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activerecord-3.0.5/lib/active_record/associations/ association_collection.rb:431:in `method_missing'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activerecord-3.0.5/lib/active_record/autosave_association.rb:297:in `save_collection_association'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activerecord-3.0.5/lib/active_record/autosave_association.rb:163:in `block in add_autosave_association_callbacks'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activesupport-3.0.5/lib/active_support/callbacks.rb:415:in `_run_create_callbacks'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activerecord-3.0.5/lib/active_record/callbacks.rb:281:in `create'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activerecord-3.0.5/lib/active_record/persistence.rb:246:in `create_or_update'' ... 18 levels... from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activerecord-3.0.5/lib/active_record/callbacks.rb:277:in `create_or_update'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activerecord-3.0.5/lib/active_record/persistence.rb:56:in `save!'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activerecord-3.0.5/lib/active_record/validations.rb:49:in `save!'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activerecord-3.0.5/lib/active_record/attribute_methods/dirty.rb:30:in `save!'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activerecord-3.0.5/lib/active_record/transactions.rb:245:in `block in save!'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activerecord-3.0.5/lib/active_record/transactions.rb:292:in `block in with_transaction_returning_status'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activerecord-3.0.5/lib/active_record/connection_adapters/abstract/ database_statements.rb:139:in `transaction'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activerecord-3.0.5/lib/active_record/transactions.rb:207:in `transaction'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activerecord-3.0.5/lib/active_record/transactions.rb:290:in `with_transaction_returning_status'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ activerecord-3.0.5/lib/active_record/transactions.rb:245:in `save!'' from (irb):14 from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ railties-3.0.5/lib/rails/commands/console.rb:44:in `start'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ railties-3.0.5/lib/rails/commands/console.rb:8:in `start'' from /Users/gander/.rvm/gems/ruby-1.9.2-p180@sms2/gems/ railties-3.0.5/lib/rails/commands.rb:23:in `<top (required)>'' from script/rails:6:in `require'' from script/rails:6:in `<main>''ruby-1.9.2-p180 :015 > If I remove the role assignment, everything is just peachy (finds, saves, destroys, etc), but the second I try to save roles everything blows sky-high with this message that, frankly, I don''t get. It knows its got the roles, there is no nil object that I can tell. . .and basically if I wasn''t already bald I''d be pulling my hair out ; ) Any insight into this is EXTREMELY appreciated! Gerald -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Frederick Cheung
2011-Apr-13 11:16 UTC
Re: Rails habtm grief am I dumb or rails bug? (desperate ; )
On Apr 13, 2:13 am, Gerald Anderson <gan...-E00tY0O2PJxBDgjK7y7TUQ@public.gmane.org> wrote:> If I remove the role assignment, everything is just peachy (finds, > saves, destroys, etc), but the second I try to save roles everything > blows sky-high with this message that, frankly, I don''t get. It knows > its got the roles, there is no nil object that I can tell. . .and > basically if I wasn''t already bald I''d be pulling my hair out ; )A cursory examination of the arel code suggests this might happen if one of the columns you name doesn''t in fact exist Fred> > Any insight into this is EXTREMELY appreciated! > > Gerald-- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Gerald Anderson
2011-Apr-13 12:06 UTC
Re: Rails habtm grief am I dumb or rails bug? (desperate ; )
Fred, thanks for the reply. That would seem to be logical and one of the first things I checked. The table definition for the relationship table is (pulled straight from the production db): CREATE TABLE IF NOT EXISTS `users_roles` ( `user_account_id` bigint(20) NOT NULL, `user_role_id` bigint(20) NOT NULL, KEY `FKF6CCD9C617041664` (`user_role_id`), KEY `FKF6CCD9C63044D5F0` (`user_account_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; Any other ideas (or do you see something I don''t)? This one is driving me nuts and has me totally shut down : / G On Apr 13, 6:16 am, Frederick Cheung <frederick.che...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> On Apr 13, 2:13 am, Gerald Anderson <gan...-E00tY0O2PJxBDgjK7y7TUQ@public.gmane.org> wrote: > > > If I remove the role assignment, everything is just peachy (finds, > > saves, destroys, etc), but the second I try to save roles everything > > blows sky-high with this message that, frankly, I don''t get. It knows > > its got the roles, there is no nil object that I can tell. . .and > > basically if I wasn''t already bald I''d be pulling my hair out ; ) > > A cursory examination of the arel code suggests this might happen if > one of the columns you name doesn''t in fact exist > > Fred > > > > > > > > > > > Any insight into this is EXTREMELY appreciated! > > > Gerald-- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Gerald Anderson
2011-Apr-13 12:14 UTC
Re: Rails habtm grief am I dumb or rails bug? (desperate ; )
Another note along these lines. . . if I load an existing user with existing roles, they load fine. It just won''t let me add new ones. G On Apr 13, 6:16 am, Frederick Cheung <frederick.che...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> On Apr 13, 2:13 am, Gerald Anderson <gan...-E00tY0O2PJxBDgjK7y7TUQ@public.gmane.org> wrote: > > > If I remove the role assignment, everything is just peachy (finds, > > saves, destroys, etc), but the second I try to save roles everything > > blows sky-high with this message that, frankly, I don''t get. It knows > > its got the roles, there is no nil object that I can tell. . .and > > basically if I wasn''t already bald I''d be pulling my hair out ; ) > > A cursory examination of the arel code suggests this might happen if > one of the columns you name doesn''t in fact exist > > Fred > > > > > > > > > > > Any insight into this is EXTREMELY appreciated! > > > Gerald-- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Frederick Cheung
2011-Apr-13 12:18 UTC
Re: Rails habtm grief am I dumb or rails bug? (desperate ; )
On Apr 13, 1:06 pm, Gerald Anderson <gan...-E00tY0O2PJxBDgjK7y7TUQ@public.gmane.org> wrote:> Fred, thanks for the reply. That would seem to be logical and one of > the first things I checked. The table definition for the relationship > table is (pulled straight from the production db): > > CREATE TABLE IF NOT EXISTS `users_roles` ( > `user_account_id` bigint(20) NOT NULL, > `user_role_id` bigint(20) NOT NULL, > KEY `FKF6CCD9C617041664` (`user_role_id`), > KEY `FKF6CCD9C63044D5F0` (`user_account_id`) > ) ENGINE=MyISAM DEFAULT CHARSET=latin1; > > Any other ideas (or do you see something I don''t)? This one is > driving me nuts and has me totally shut down : / >I''d double check the sql statemnts rails generates when it is listing columns to see if they''re going to the right database. Have you tried stepping though the rails insert process in the debugger to see where it dies? Fred> G > > On Apr 13, 6:16 am, Frederick Cheung <frederick.che...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> > wrote: > > > > > On Apr 13, 2:13 am, Gerald Anderson <gan...-E00tY0O2PJxBDgjK7y7TUQ@public.gmane.org> wrote: > > > > If I remove the role assignment, everything is just peachy (finds, > > > saves, destroys, etc), but the second I try to save roles everything > > > blows sky-high with this message that, frankly, I don''t get. It knows > > > its got the roles, there is no nil object that I can tell. . .and > > > basically if I wasn''t already bald I''d be pulling my hair out ; ) > > > A cursory examination of the arel code suggests this might happen if > > one of the columns you name doesn''t in fact exist > > > Fred > > > > Any insight into this is EXTREMELY appreciated! > > > > Gerald-- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Gerald Anderson
2011-Apr-13 16:44 UTC
Re: Rails habtm grief am I dumb or rails bug? (desperate ; )
Ok, so I''ve never put a debugger on a rails app before, wasn''t real excited to do so ; ) But. . I did. I''m still poking around, BUT it LOOKS as though it MAY (like all the emphasis?) not know that the users_role table is in pb_prod (external db) even though it DOES know that the two ActiveRecord objects are and there''s explicit declaration in my habtm key definitions. Details: in arel-2.0.9/lib/arel/table.rb:101 It''s returning false for table_exists? (well, returns nil because of that) That''s calling table.rb:121 which says: @table_exists? ||= tables.key?("pb_prod.users_roles") || engine.connection.table_exists?("user_account_id") Now, to me it looks like the values for those two or backwards (key implies key, not table name, and reverse for table_exists?) but. . key? returns false, and table_exists? sends me to: activerecord-3.0.5/lib/active_record/connection_adapters/abstract/ schema_statements.rb:20 def table_exists?(table_name) tables.include?(table_name.to_s) end And, don''t you know it, tables contains the rails database tables not the external application''s tables. So. . it IS looking at the wrong database. Ok, now what? I''ve tried explicitly stating in the key definitions for the habtm what schema to look at. Any suggestions on what to look at from here? Thanks again! G On Apr 13, 7:18 am, Frederick Cheung <frederick.che...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> On Apr 13, 1:06 pm, Gerald Anderson <gan...-E00tY0O2PJxBDgjK7y7TUQ@public.gmane.org> wrote: > > > Fred, thanks for the reply. That would seem to be logical and one of > > the first things I checked. The table definition for the relationship > > table is (pulled straight from the production db): > > > CREATE TABLE IF NOT EXISTS `users_roles` ( > > `user_account_id` bigint(20) NOT NULL, > > `user_role_id` bigint(20) NOT NULL, > > KEY `FKF6CCD9C617041664` (`user_role_id`), > > KEY `FKF6CCD9C63044D5F0` (`user_account_id`) > > ) ENGINE=MyISAM DEFAULT CHARSET=latin1; > > > Any other ideas (or do you see something I don''t)? This one is > > driving me nuts and has me totally shut down : / > > I''d double check the sql statemnts rails generates when it is listing > columns to see if they''re going to the right database. > Have you tried stepping though the rails insert process in the > debugger to see where it dies? > > Fred > > > > > > > > > G > > > On Apr 13, 6:16 am, Frederick Cheung <frederick.che...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> > > wrote: > > > > On Apr 13, 2:13 am, Gerald Anderson <gan...-E00tY0O2PJxBDgjK7y7TUQ@public.gmane.org> wrote: > > > > > If I remove the role assignment, everything is just peachy (finds, > > > > saves, destroys, etc), but the second I try to save roles everything > > > > blows sky-high with this message that, frankly, I don''t get. It knows > > > > its got the roles, there is no nil object that I can tell. . .and > > > > basically if I wasn''t already bald I''d be pulling my hair out ; ) > > > > A cursory examination of the arel code suggests this might happen if > > > one of the columns you name doesn''t in fact exist > > > > Fred > > > > > Any insight into this is EXTREMELY appreciated! > > > > > Gerald-- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Gerald Anderson
2011-Apr-13 17:20 UTC
Re: Rails habtm grief am I dumb or rails bug? (desperate ; )
Grr, have had two meetings in the middle of all this, forgive my lack of coherence. Bottom line is it looks like it instantiates the engine as the rails database and with no way (that I know of) of specifying which db to look at for the relation table I''m kind of screwed. It seems to ignore the fact that I''m using :join_table => ''pb_prod.users_roles" for the relationship definition (pb_prod is the external database) and isn''t picking up which database to use from either object (connection :pushbroom). So it looks to me, at the moment, as though I''m stuck. It does bother me though that it LOADS the relationships fine. Just seems to be a problem on inserts. Again, just spouting what I''ve found and desperately looking for a solution. Would prefer to find out I''m just being an idiot instead of having to implement some solution with seriously high code smell. Thanks! G On Apr 13, 11:44 am, Gerald Anderson <gan...-E00tY0O2PJxBDgjK7y7TUQ@public.gmane.org> wrote:> Ok, so I''ve never put a debugger on a rails app before, wasn''t real > excited to do so ; ) > > But. . I did. I''m still poking around, BUT it LOOKS as though it MAY > (like all the emphasis?) not know that the users_role table is in > pb_prod (external db) even though it DOES know that the two > ActiveRecord objects are and there''s explicit declaration in my habtm > key definitions. Details: > > in arel-2.0.9/lib/arel/table.rb:101 > It''s returning false for table_exists? (well, returns nil because of > that) > That''s calling table.rb:121 which says: > @table_exists? ||= tables.key?("pb_prod.users_roles") || > engine.connection.table_exists?("user_account_id") > > Now, to me it looks like the values for those two or backwards (key > implies key, not table name, and reverse for table_exists?) but. . > key? returns false, and table_exists? sends me to: > > activerecord-3.0.5/lib/active_record/connection_adapters/abstract/ > schema_statements.rb:20 > > def table_exists?(table_name) > tables.include?(table_name.to_s) > end > > And, don''t you know it, tables contains the rails database tables not > the external application''s tables. > > So. . it IS looking at the wrong database. > > Ok, now what? I''ve tried explicitly stating in the key definitions > for the habtm what schema to look at. Any suggestions on what to look > at from here? > > Thanks again! > > G > > On Apr 13, 7:18 am, Frederick Cheung <frederick.che...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> > wrote: > > > > > > > > > On Apr 13, 1:06 pm, Gerald Anderson <gan...-E00tY0O2PJxBDgjK7y7TUQ@public.gmane.org> wrote: > > > > Fred, thanks for the reply. That would seem to be logical and one of > > > the first things I checked. The table definition for the relationship > > > table is (pulled straight from the production db): > > > > CREATE TABLE IF NOT EXISTS `users_roles` ( > > > `user_account_id` bigint(20) NOT NULL, > > > `user_role_id` bigint(20) NOT NULL, > > > KEY `FKF6CCD9C617041664` (`user_role_id`), > > > KEY `FKF6CCD9C63044D5F0` (`user_account_id`) > > > ) ENGINE=MyISAM DEFAULT CHARSET=latin1; > > > > Any other ideas (or do you see something I don''t)? This one is > > > driving me nuts and has me totally shut down : / > > > I''d double check the sql statemnts rails generates when it is listing > > columns to see if they''re going to the right database. > > Have you tried stepping though the rails insert process in the > > debugger to see where it dies? > > > Fred > > > > G > > > > On Apr 13, 6:16 am, Frederick Cheung <frederick.che...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> > > > wrote: > > > > > On Apr 13, 2:13 am, Gerald Anderson <gan...-E00tY0O2PJxBDgjK7y7TUQ@public.gmane.org> wrote: > > > > > > If I remove the role assignment, everything is just peachy (finds, > > > > > saves, destroys, etc), but the second I try to save roles everything > > > > > blows sky-high with this message that, frankly, I don''t get. It knows > > > > > its got the roles, there is no nil object that I can tell. . .and > > > > > basically if I wasn''t already bald I''d be pulling my hair out ; ) > > > > > A cursory examination of the arel code suggests this might happen if > > > > one of the columns you name doesn''t in fact exist > > > > > Fred > > > > > > Any insight into this is EXTREMELY appreciated! > > > > > > Gerald-- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Matt Jones
2011-Apr-14 11:47 UTC
Re: Rails habtm grief am I dumb or rails bug? (desperate ; )
On Apr 13, 1:20 pm, Gerald Anderson <gan...-E00tY0O2PJxBDgjK7y7TUQ@public.gmane.org> wrote:> Grr, have had two meetings in the middle of all this, forgive my lack > of coherence. Bottom line is it looks like it instantiates the engine > as the rails database and with no way (that I know of) of specifying > which db to look at for the relation table I''m kind of screwed. It > seems to ignore the fact that I''m using :join_table => > ''pb_prod.users_roles" for the relationship definition (pb_prod is the > external database) and isn''t picking up which database to use from > either object (connection :pushbroom). > > So it looks to me, at the moment, as though I''m stuck. It does bother > me though that it LOADS the relationships fine. Just seems to be a > problem on inserts. > > Again, just spouting what I''ve found and desperately looking for a > solution. Would prefer to find out I''m just being an idiot instead of > having to implement some solution with seriously high code smell. >Short of finding and squashing the bug, one not-too-smelly alternative might be to make a real model for users_roles, like this: class UsersRoles < ActiveRecord::Base establish_connection :pushbroom set_primary_key nil belongs_to :user_account, :class_name => ''PushBroom::UserAccount'' belongs_to :user_role, :class_name => ''PushBroom::UserRole'' end then you could replace the habtm call with a set of has_many :throughs, which shouldn''t have the same problem (since you''ve explicitly told Rails the join table is on the :pushbroom connection). --Matt Jones -- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Gerald Anderson
2011-Apr-14 11:57 UTC
Re: Rails habtm grief am I dumb or rails bug? (desperate ; )
Good timing, just got it fixed (non-smelly)and you''re pretty close to the mark. The answer? has_many :through - something I''d never taking much of a look at, but it is actually a pretty nice feature (even in other circumstances). Basically this just allows me to create a model class which represents the relationship. And since I have a model class for it I can explicitly specify the database to connect to. For posterity sake, here''s the code: class Pushbroom::UsersRolesRelationship < ActiveRecord::Base establish_connection :pushbroom set_table_name :users_roles belongs_to :user_account belongs_to :user_role end class Pushbroom::UserAccount < ActiveRecord::Base establish_connection :pushbroom set_table_name :user_account set_primary_key :id has_many :users_roles_relationships has_many :user_roles, :through => :users_roles_relationships, :source => :user_role end class Pushbroom::UserRole < ActiveRecord::Base establish_connection :pushbroom set_table_name :user_role set_primary_key :id has_many :users_roles_relationships has_many :user_accounts, :through => :users_roles_relationships, :source => :user_account end And is used thusly: def add_subscription_plan_roles_to_pb_user_account(pb_user_account) roles_granted pb_user_account.user.subscriptions.first.subscription_plan.roles_granted pb_user_account.user_roles = roles_granted end Thanks a ton folks for helping me get this train moving again! All my tests are passing and it seems to be working, but if you see something wrong, please do still let me know. Thanks! Gerald On Apr 14, 6:47 am, Matt Jones <al2o...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> On Apr 13, 1:20 pm, Gerald Anderson <gan...-E00tY0O2PJxBDgjK7y7TUQ@public.gmane.org> wrote: > > > > > > > > > > > Grr, have had two meetings in the middle of all this, forgive my lack > > of coherence. Bottom line is it looks like it instantiates the engine > > as the rails database and with no way (that I know of) of specifying > > which db to look at for the relation table I''m kind of screwed. It > > seems to ignore the fact that I''m using :join_table => > > ''pb_prod.users_roles" for the relationship definition (pb_prod is the > > external database) and isn''t picking up which database to use from > > either object (connection :pushbroom). > > > So it looks to me, at the moment, as though I''m stuck. It does bother > > me though that it LOADS the relationships fine. Just seems to be a > > problem on inserts. > > > Again, just spouting what I''ve found and desperately looking for a > > solution. Would prefer to find out I''m just being an idiot instead of > > having to implement some solution with seriously high code smell. > > Short of finding and squashing the bug, one not-too-smelly alternative > might be to make a real model for users_roles, like this: > > class UsersRoles < ActiveRecord::Base > establish_connection :pushbroom > set_primary_key nil > > belongs_to :user_account, :class_name => ''PushBroom::UserAccount'' > belongs_to :user_role, :class_name => ''PushBroom::UserRole'' > end > > then you could replace the habtm call with a set of > has_many :throughs, which shouldn''t have the same problem (since > you''ve explicitly told Rails the join table is on the :pushbroom > connection). > > --Matt Jones-- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Gerald Anderson
2011-Apr-14 11:59 UTC
Re: Rails habtm grief am I dumb or rails bug? (desperate ; )
Oh, also meant to say I don''t know that the habtm thing is a bug (not a feature either : b). It''s not the way I would like to see it work but the rails code that I looked at just flat doesn''t make allowances for m2m relationship tables outside of the rails db that I could tell. Gerald On Apr 14, 6:47 am, Matt Jones <al2o...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> On Apr 13, 1:20 pm, Gerald Anderson <gan...-E00tY0O2PJxBDgjK7y7TUQ@public.gmane.org> wrote: > > > > > > > > > > > Grr, have had two meetings in the middle of all this, forgive my lack > > of coherence. Bottom line is it looks like it instantiates the engine > > as the rails database and with no way (that I know of) of specifying > > which db to look at for the relation table I''m kind of screwed. It > > seems to ignore the fact that I''m using :join_table => > > ''pb_prod.users_roles" for the relationship definition (pb_prod is the > > external database) and isn''t picking up which database to use from > > either object (connection :pushbroom). > > > So it looks to me, at the moment, as though I''m stuck. It does bother > > me though that it LOADS the relationships fine. Just seems to be a > > problem on inserts. > > > Again, just spouting what I''ve found and desperately looking for a > > solution. Would prefer to find out I''m just being an idiot instead of > > having to implement some solution with seriously high code smell. > > Short of finding and squashing the bug, one not-too-smelly alternative > might be to make a real model for users_roles, like this: > > class UsersRoles < ActiveRecord::Base > establish_connection :pushbroom > set_primary_key nil > > belongs_to :user_account, :class_name => ''PushBroom::UserAccount'' > belongs_to :user_role, :class_name => ''PushBroom::UserRole'' > end > > then you could replace the habtm call with a set of > has_many :throughs, which shouldn''t have the same problem (since > you''ve explicitly told Rails the join table is on the :pushbroom > connection). > > --Matt Jones-- 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-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.