From: Yuri Leikind Date: 2008-02-06T19:06:30+09:00 Subject: weird behavior of belongs_to referencing a model with set_table_name : a bug? ------=_Part_16984_19391814.1202292392005 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Hello all, Since nobody answered the letter below in rubyonrails-talk, I've taken the courage to repost it here. I looks like a bug, but I just refuse to believe it as it is such a basic functionality of Active Record. ---------- Forwarded message ---------- From: Yuri Leikind Date: 5 feb. 2008 13:24 Subject: weird behavior of belongs_to referencing a model with set_table_name To: rubyonrails-talk@googlegroups.com Hello all, I am experiencing some really weird behavior of belongs_to with a model where the table name is set by set_table_name I have two simple models: === file legal_entity.rb class LegalEntity < ActiveRecord::Base set_table_name 'legalentities' end === file legal_entity_person.rb class LegalEntityPerson < ActiveRecord::Base set_table_name 'legalentities_people' belongs_to :legal_entity, :foreign_key => ' legalentity_id' end ===== If I find a LegalEntityPerson object with :include => :legal_entity it works as expected: $ ./script/runner 'a = LegalEntityPerson.find(:first, :include => :legal_entity); p a.legal_entity' # and looking a the log I see the select method with the 2 tables joined, it's fine. Now, if I drop :include => :legal_entity, a.legal_entity returns nil: $ ./script/runner 'a = LegalEntityPerson.find(:first); p a.legal_entity' nil And what is interesting is that there is no SQL query to the DB, that is, there is SELECT * FROM `legalentities_people` LIMIT 1 for the find method, and nothing else, a.legal_entity silently returns nil without any warnings or complaints. If I rewrite my models like this following naming conventions: === file legalentity.rb class Legalentity < ActiveRecord::Base end === file legal_entity_person.rb class LegalEntityPerson < ActiveRecord::Base set_table_name 'legalentities_people' belongs_to :legalentity end ===== it works: $ ./script/runner 'a = LegalEntityPerson.find(:first); p a.legalentity' # BUT!!! If I specify :foreign_key explicitly like this: belongs_to :legalentity, :foreign_key => ' legalentity_id' it doesn't work again: Is there any reason behind this behavior or is it a bug? I am using Rails 2.0.2, mysql 5.0.51a, all running on OS X, and with the following sql code you can reproduce it: CREATE TABLE `legalentities` ( `id` int(10) unsigned NOT NULL auto_increment, `name` varchar(255) NOT NULL, `legalentitytype_id` int(10) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; INSERT INTO `legalentities` VALUES (1,'Some Company',3); CREATE TABLE `legalentities_people` ( `id` int(10) unsigned NOT NULL auto_increment, `legalentity_id` int(10) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; INSERT INTO `legalentities_people` VALUES (1,1); -- Best regards, Yuri Leikind ------=_Part_16984_19391814.1202292392005 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Hello all,

Since nobody answered the letter below in rubyonrails-talk, I've taken the courage to repost it here.
I looks like a bug, but I just refuse to believe it as it is such a basic functionality of Active Record.

---------- Forwarded message ----------
From: Yuri Leikind <yuri.leikind@gmail.com>
Date: 5 feb. 2008 13:24
Subject: weird behavior of belongs_to referencing a model with set_table_name
To: rubyonrails-talk@googlegroups.com

Hello all,

 
I am experiencing some really weird behavior of belongs_to with a model where the table name is set by set_table_name

 
I have two simple models:

 
=== file legal_entity.rb

 
class LegalEntity < ActiveRecord::Base
  set_table_name 'legalentities'
end

 

 
=== file legal_entity_person.rb

 
class LegalEntityPerson < ActiveRecord::Base
  
  set_table_name 'legalentities_people'
  
  belongs_to :legal_entity, :foreign_key => ' legalentity_id'
end

 
=====

 
If I find a LegalEntityPerson object with :include => :legal_entity it works as expected:

$  ./script/runner  'a = LegalEntityPerson.find(:first, :include => :legal_entity); p a.legal_entity'
#<LegalEntity id: 1, name: "Some Company", legalentitytype_id: 3>

 
and looking a the log I see the select method with the 2 tables joined, it's fine.

 
Now, if I drop :include => :legal_entity, a.legal_entity returns nil:

 
$  ./script/runner 'a = LegalEntityPerson.find(:first); p a.legal_entity'
nil

 
And what is interesting is that there is no SQL query to the DB, that is, there is  SELECT * FROM `legalentities_people` LIMIT 1 for the find method, and nothing else, a.legal_entity silently returns nil without any warnings or complaints.

 

 
If I rewrite my models like this following naming conventions:

 
=== file legalentity.rb

 
class Legalentity < ActiveRecord::Base

 
end

 

 
=== file legal_entity_person.rb

 
class LegalEntityPerson < ActiveRecord::Base
  
  set_table_name 'legalentities_people'
  
  belongs_to :legalentity
end

 
=====

 
it works:

 
$  ./script/runner 'a = LegalEntityPerson.find(:first); p a.legalentity'
#<Legalentity id: 1, name: "Some Company", legalentitytype_id: 3>

 

 
BUT!!!

 
If I specify :foreign_key explicitly like this:

 
  belongs_to :legalentity, :foreign_key => ' legalentity_id'

 
 
it doesn't work again:

 

 
Is there any reason behind this behavior or is it a bug?

 
I am using Rails 2.0.2,  mysql 5.0.51a, all running on OS X, and with the following sql code you can reproduce it:

 
CREATE TABLE `legalentities` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  `legalentitytype_id` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

 
INSERT INTO `legalentities` VALUES (1,'Some Company',3);

 
CREATE TABLE `legalentities_people` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `legalentity_id` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

 
INSERT INTO `legalentities_people` VALUES (1,1);

--
Best regards,
Yuri Leikind


 
------=_Part_16984_19391814.1202292392005--