Hi Daniel

Thanks for helping :-)

This is exactly how I was thinking it should work. But I just tried
using set_table_name and I still got the same result, for example, using
your code (which is exactly what I'd love to do), I get this:

w = Worker.create(:name => "WorkerName") # ok
p = Person.create(:name => "PersonName") # ok
ac = AnotherClass.create # ok

ac.worker = w # here i got the error! like:
# ActiveRecord::StatementInvalid: Mysql::Error: Unknown column
'person.another_class_id' in 'where clause': SELECT * FROM `person`
WHERE (`person`.another_class_id = 1)  LIMIT 1

It still goes to the parent class to search for the relational id.
"set_table_name" works for you in this particular case? could it be the
activerecord version I use? My gems are:

actionmailer (2.3.9)
actionpack (2.3.9)
activerecord (2.3.9)
activeresource (2.3.9)
activesupport (2.3.9)
builder (2.1.2)
capistrano (2.5.19)
highline (1.6.1)
i18n (0.4.1, 0.3.7)
json (1.4.6)
json_pure (1.4.6)
multi_json (0.0.4)
mysql (2.8.1)
net-scp (1.0.3)
net-sftp (2.0.5)
net-ssh (2.0.23)
net-ssh-gateway (1.0.1)
pg (0.9.0)
racc (1.4.6)
rack (1.1.0)
rails (2.3.9)
rake (0.8.7)
rspec (1.3.0)
text-format (1.0.0)
text-hyphen (1.0.0)
tmail (1.2.7.1)
tzinfo (0.3.23)
will_paginate (2.3.14)


And the trace when I get the error:

from 
/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/connection_adapters/abstract_adapter.rb:227:in
 `log'

from 
/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/connection_adapters/mysql_adapter.rb:324:in
 `execute'

from 
/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/connection_adapters/mysql_adapter.rb:639:in
 `select'

from 
/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/connection_adapters/abstract/database_statements.rb:7:in
 `select_all_without_query_cache'

from 
/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/connection_adapters/abstract/query_cache.rb:62:in
 `select_all'

from 
/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/base.rb:665:in
 `find_by_sql'

from 
/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/base.rb:1582:in
 `find_every'

from 
/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/base.rb:1539:in
 `find_initial'

from 
/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/base.rb:617:in
 `find'

from 
/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/associations/has_one_association.rb:81:in
 `find_target'

from 
/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/associations/association_proxy.rb:236:in
 `load_target'

from 
/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/associations/association_proxy.rb:113:in
 `reload'

from 
/usr/lib64/ruby/gems/1.8/gems/activerecord-2.3.9/lib/active_record/associations.rb:1256:in
 `worker'
        from (irb):2

Regards,

Javi Ruiz

 

On Mon, 2010-09-13 at 14:30 -0500, Daniel Gaytán wrote:
> Hello  Javier,
> 
> I was just checking the set_table_name class method of ActiveRecord
> and I think that could work for you:
> 
> class AnotherClass < ActiveRecord::Base
>   has_one :worker
> end
> 
> class Person < ActiveRecord::Base
>   def something
>     self.name
>   end
> end
> 
> class Worker < Person
>   set_table_name "workers"
> end
> 
> w = Worker.create(:name => "WorkerName")
> p = Person.create(:name => "PersonName")
> ac = AnotherClass.create
> 
> ac.worker = w
> ac.save
> 
> ac.worker.something # => "WorkerName"
> 
> 
> I hope that would be helpful
> 
> Daniel Gaytán
> 
> 2010/9/13 Marnen Laibow-Koser <li...@ruby-forum.com>
>         [Please quote when replying.  Otherwise the discussion is
>         impossible to
>         follow.]
>         
>         Javier Ruiz wrote:
>         > Yep that's finally how I will have to do it... but this is
>         not what I
>         > wanted. A has_one relation means that I have to access
>         things like:
>         >
>         > Anotherclass.property
>         > Anotherclass.childclass.specific_property
>         > Anotherclass.childclass.parentclass.common_property
>         
>         
>         That makes sense from a relational point of view.  If you
>         don't like it,
>         then use STI.
>         
>         >
>         > And more important... I need to manually manage related
>         objects (or
>         > create hooks os similar). I mean I need for example to do
>         something
>         > like:
>         >
>         > a = Anotherclass.new
>         > b = Childclass.new
>         > a.childclass = b
>         >
>         > ... and so on...
>         
>         
>         You'd need to do that regardless of whether your original idea
>         worked.
>         
>         >
>         > I was thinking "rails' magic" was really magic ;-)
>         
>         
>         I suppose it is, but it doesn't extend to spreading one class
>         across
>         multiple tables.
>         
>         If you were ambitious, you probably *could* extend
>         ActiveRecord to do
>         that, but I'm not sure it's a good idea -- it's trying to
>         impose too
>         much of an OO approach on a relational DB.  Alternatively, you
>         could try
>         an OODB like GemStone/MagLev.
>         
>         
>         Best,
>         --
>         Marnen Laibow-Koser
>         http://www.marnen.org
>         mar...@marnen.org
>         
>         --
>         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-t...@googlegroups.com.
>         To unsubscribe from this group, send email to rubyonrails-talk
>         +unsubscr...@googlegroups.com.
>         For more options, visit this group at
>         http://groups.google.com/group/rubyonrails-talk?hl=en.
>         
>         
> 
> 
> 
> -- 
> 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-t...@googlegroups.com.
> To unsubscribe from this group, send email to rubyonrails-talk
> +unsubscr...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/rubyonrails-talk?hl=en.

-- 
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-t...@googlegroups.com.
To unsubscribe from this group, send email to 
rubyonrails-talk+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en.

Reply via email to