hzamani / active_record-acts_as

Simulate multi-table inheritance for activerecord models
MIT License
252 stars 86 forks source link

accessing #acting_as through association returns the wrong actable #50

Open risen opened 8 years ago

risen commented 8 years ago

There seems to be a problem if you have a circular dependency in your actable base class.

Example:

class Product < ActiveRecord::Base
  actable
  belongs_to :pen_case
end

class Pen < ActiveRecord::Base
  acts_as :product
end

class PenCase < ActiveRecord::Base
  acts_as :product
  has_many :products
end

As you can see Product has a reference pen_case_id to PenCase, which again, is a Product.

Now, this happens:

>> PenCase.first.products
+----+------------+--------------+-------------+--------+-------+
| id | actable_id | actable_type | pen_case_id | name   | price |
+----+------------+--------------+-------------+--------+-------+
| 1  | 1          | Pen          | 1           | Penie! | 0.8   |
+----+------------+--------------+-------------+--------+-------+
1 row in set
>> Pen.first.product.id
=> 1
>> PenCase.first.product.id
=> 2
>> Pen.first.pen_case.product.id
=> 1

As you can see accessing #product (or #acting_as) gives the wrong result if we go through the Product#pen_case association. Weird?

risen commented 8 years ago

See also: https://gist.github.com/risen/b5a76d0929379303af30

hzamani commented 8 years ago

Why there should be such a circular dependency in model?