Forum: Ruby on Rails Multi table inheritance problem with has_one relationship

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Rémi G. (Guest)
on 2009-01-27 20:46
Here is my issue

class TransactionProduct < ActiveRecord::Base
  has_one :product, :class_name => 'Product'
end

class Product < ActiveRecord::Base
  set_inheritance_column :class_name
end

class ProductVT < Product
 def self.base_class
    ProductVt
  end
end

So when I do

Product.find(:first) I got an instance of ProductVT with only the
columns of Product, which is ok.  Then when I do reload like this :

Product.find(:first).reload

I do have a complete instance of ProductVT.

But

When I do nagivate on Product from TransactionProduct and I do reload on
the instance of ProductVT it does not reload the ProductVT, it does it
on Product

TransactionProduct.find(:first).product.relaod  (reload the product
instance instead of ProductVT)

Even if I see in the console that is a ProductVT it reloads Product.  I
checked in development.log and in performs the query on Product.


Any idea.


Note : A temp fix is the to do a
Product.find(TransactionProduct.find(:first).product).reload, which is
ugly
Thomas r. K. (Guest)
on 2009-01-28 21:10
(Received via mailing list)
Hi,

On Jan 27, 7:46 pm, Rémi Gagnon <removed_email_address@domain.invalid>
wrote:

> TransactionProduct.find(:first).product.relaod  (reload the product
> instance instead of ProductVT)
>
> Even if I see in the console that is a ProductVT it reloads Product.  I
> checked in development.log and in performs the query on Product.
>
> Any idea.

I fear I got lost somewhere but did you know 'becomes' ?
TransactionProduct.find(:first).product(true).becomes(ProductVT)

BTW, the product(true) that I used is is quite(?) the same like
product.reload

ciao, tom
Rémi G. (Guest)
on 2009-01-28 21:39
Thanks Tom for the suggestion.  I did not know this.  But the bads new
is that does the same issue.

It looks like the superclass name is cached in the association then even
if I do a reload or (true) and becomes, it fetch the data from Product
instead of ProductVT

Rémi


Thomas r. Koll wrote:
> Hi,
>
> On Jan 27, 7:46�pm, R�mi Gagnon <removed_email_address@domain.invalid>
> wrote:
>
>> TransactionProduct.find(:first).product.relaod �(reload the product
>> instance instead of ProductVT)
>>
>> Even if I see in the console that is a ProductVT it reloads Product. �I
>> checked in development.log and in performs the query on Product.
>>
>> Any idea.
>
> I fear I got lost somewhere but did you know 'becomes' ?
> TransactionProduct.find(:first).product(true).becomes(ProductVT)
>
> BTW, the product(true) that I used is is quite(?) the same like
> product.reload
>
> ciao, tom
This topic is locked and can not be replied to.