Forum: Ruby on Rails AR: abstract model and eager loading

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.
Dax H. (Guest)
on 2007-05-26 01:18
Hi,

I have the following setup:

class Item < ActiveRecord::Base
  belongs_to :item, :polymorphic => true
end

class AbstractItem < ActiveRecord::Base
  has_one :item, :as => :item
  def self.abstract_class?; self == AbstractItem; end
end

class Post < AbstractItem
end

Now, when I do a
post = Post.find :first, :include => :item
inside my controller, post.item will be nil.
I can do
post = Post.find :first
and then post.item will work, but it uses a second query.

But if I don't use AbstractItem and use Post as follow:

class Post < ActiveRecord::Base
  has_one :item, :as => :item
end

Then
post = Post.find :first, :include => :item
will work just fine, takes one query, nada problems.

The reason I would like an abstract model is because there will be a lot
of identical functionality within all the item types.

So, what's the reason eager loading doesn't work with abstract models.
How can I solve this and/or is there another/better way to solve this.
AndyV (Guest)
on 2007-05-26 03:48
(Received via mailing list)
Have you considered using Single Table Inheritance (STI) to implement
this?  With STI you can persist your objects in only one table, and
use the inheritance to keep your classes DRY.

On May 25, 5:18 pm, Dax H. <removed_email_address@domain.invalid>
Dax H. (Guest)
on 2007-05-29 19:09
Yes, but the sub types will be very different, STI won't be a nice
option here.
I saw a different approach using a module and include that one in the
models, haven't tried it yet.

But still, it's just weird that it doesn't work as expected, and I can't
see any reason why not.
This topic is locked and can not be replied to.