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 L.