Multi table inheritance problem with has_one relationship


#1

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


#2

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


#3

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