boblu
2009-Aug-08 02:56 UTC
why associations get error when defined in abstract_class model
I have many models and want to share common functions among them in
abstract_class models as many as possible.
But why the associations specified in abstract_class do not work?
For example:
class Property < AR::Base
self.abstract_class = true
belongs_to :dictionary, :foreign_key=>''dictionary_id'',
:class_name
=>"#{self.class.parent.name}::Dictionary"
#############
I did this instead of specify them in Jp::Property and Cn::Property
seperately.
In Jp::Property
belongs_to :dictionary, :foreign_key=>''dictionary_id'',
:class_name
=>"Jp::Dictionary"
In Cn::Property
belongs_to :dictionary, :foreign_key=>''dictionary_id'',
:class_name
=>"Cn::Dictionary"
#############
end
class Dictionary < AR::Base
self.abstract_class = true
end
class Jp::Property < Property
set_table_name :jp_properties
end
class Jp::Dictionary < Dictioanry
set_table_name :jp_dictionaries
end
class Cn::Property < Property
set_table_name :cn_properties
end
class Cn::Dictionary < Dictioanry
set_table_name :cn_dictionaries
end
when I fire up console when input this
temp = Jp::Property.first => first property record
temp.dictionary
NameError: uninitialized constant Dictionary
from /rails/activesupport/lib/active_support/dependencies.rb:443:in
`load_missing_constant''
from /rails/activesupport/lib/active_support/dependencies.rb:80:in
`const_missing''
from /rails/activesupport/lib/active_support/dependencies.rb:92:in
`const_missing''
from /rails/activerecord/lib/active_record/base.rb:2204:in
`compute_type''
from /rails/activesupport/lib/active_support/core_ext/kernel/
reporting.rb:11:in `silence_warnings''
from /rails/activerecord/lib/active_record/base.rb:2200:in
`compute_type''
from /rails/activerecord/lib/active_record/reflection.rb:156:in
`send''
from /rails/activerecord/lib/active_record/reflection.rb:156:in
`klass''
from /rails/activerecord/lib/active_record/associations/
belongs_to_association.rb:44:in `find_target''
from /rails/activerecord/lib/active_record/associations/
association_proxy.rb:240:in `load_target''
from /rails/activerecord/lib/active_record/associations/
association_proxy.rb:112:in `reload''
from /rails/activerecord/lib/active_record/associations.rb:1230:in
`dictionary''
Can you please explain this?
boblu
2009-Aug-08 04:23 UTC
Re: why associations get error when defined in abstract_class model
I think maybe I figured out why I''m wrong. The ''belongs_to'' declaration in abstract class is actually evaluated before the abstract class is inherited. And the sub class which is inherited from abstract class only got all the instance methods which were generated by the ''belongs_to'' declaration in its parent. So, in my example, I can never get ''Jp'' or ''Cn'' strings in the abstract class Property''s ''belongs_to'' declaration because the instance object ''temp'' never saw that declaration. Please fix me if I am wrong. On 8月8日, 午前11:56, boblu <bobl...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> I have many models and want to share common functions among them in > abstract_class models as many as possible. > > But why the associations specified in abstract_class do not work? > > For example: > > class Property < AR::Base > self.abstract_class = true > > belongs_to :dictionary, :foreign_key=>''dictionary_id'', :class_name > =>"#{self.class.parent.name}::Dictionary" > ############# > I did this instead of specify them in Jp::Property and Cn::Property > seperately. > In Jp::Property > belongs_to :dictionary, :foreign_key=>''dictionary_id'', :class_name > =>"Jp::Dictionary" > In Cn::Property > belongs_to :dictionary, :foreign_key=>''dictionary_id'', :class_name > =>"Cn::Dictionary" > ############# > > end > > class Dictionary < AR::Base > self.abstract_class = true > end > > class Jp::Property < Property > set_table_name :jp_properties > end > > class Jp::Dictionary < Dictioanry > set_table_name :jp_dictionaries > end > > class Cn::Property < Property > set_table_name :cn_properties > end > > class Cn::Dictionary < Dictioanry > set_table_name :cn_dictionaries > end > > when I fire up console when input this > > temp = Jp::Property.first => first property record > temp.dictionary > > NameError: uninitialized constant Dictionary > from /rails/activesupport/lib/active_support/dependencies.rb:443:in > `load_missing_constant'' > from /rails/activesupport/lib/active_support/dependencies.rb:80:in > `const_missing'' > from /rails/activesupport/lib/active_support/dependencies.rb:92:in > `const_missing'' > from /rails/activerecord/lib/active_record/base.rb:2204:in > `compute_type'' > from /rails/activesupport/lib/active_support/core_ext/kernel/ > reporting.rb:11:in `silence_warnings'' > from /rails/activerecord/lib/active_record/base.rb:2200:in > `compute_type'' > from /rails/activerecord/lib/active_record/reflection.rb:156:in > `send'' > from /rails/activerecord/lib/active_record/reflection.rb:156:in > `klass'' > from /rails/activerecord/lib/active_record/associations/ > belongs_to_association.rb:44:in `find_target'' > from /rails/activerecord/lib/active_record/associations/ > association_proxy.rb:240:in `load_target'' > from /rails/activerecord/lib/active_record/associations/ > association_proxy.rb:112:in `reload'' > from /rails/activerecord/lib/active_record/associations.rb:1230:in > `dictionary'' > > Can you please explain this?