Using polymorphic associations with acts_as_list

This is what I have

class Photo < ActiveRecord::Base
belongs_to :image, :polymorphic => true
acts_as_list :scope => image

class Place < ActiveRecord::Base
has_many :photos, :as => :image

class Child < ActiveRecord::Base
has_many :photos, :as => :image

I want to be able to reorder the images. What I need is for the
position of the photos to be set within the scope of the parent (ie.
either the place or child).

But when I tried it out, it is taking the “image_id” into account, but
not the “image_type”. This causes a problem when a child and a place
have the same ID.

Is there a way to set the scope differently? Is it possible to set the
scope to two individual columns?

This is what I tried and failed:
acts_as_list :scope => “#{self.image_id}#{self.image_type}"
acts_as_list :scope => "#{self.image_id}
acts_as_list :scope => :image_id and :image_type

Where am I going wrong?

If this is not possible, then I think I’ll create a seperate column
that combines the “image_id” and “image_type” columns into a single
column and point the scope to that, but I was hoping there was a better
and more elegant method and changing the DB for that.

Thank you for your help.

PS: I tried posting this via Google groups web interface, but both
times it hasn’t appeared yet. Anyone know what could be wrong. Thanks.

Minor correction:


acts_as_list :scope => image
should be
acts_as_list :scope => :image

This has been addressed on the list. One solution posted is the

acts_as_list :scope => ‘image_id=#{image_id} and imge_type=#{quote

Sean, could you explain how that works.

Do you have a link to the solution posted earlier. I tried searching,
using acts_as_list and scope, but could not find a solution.

I tried what you said, and it does not work. It says:
undefined local variable or method `image_id’ for Photo:Class

Appreciate your help.

Hi Arpan,

Here’s the original post:

I think you may want to watch how your referring to the images class. To
keep it in the idiom of rails polymorpic associations you might want to
it imageable or something. Anyway, with respect to your error I would
make sure you are doing everything according to what rails expects for
polymorpic assocations. See the wiki examples maybe. Plus I had a typo
my above example imge_type should be image_type… Good luck!


Thanks Sean,
That works now

Although I’m not exactly sure what it is doing. I’ll read up a little
bit more on it. If you could point me in the right direction for more
info on how this works, I’d welcome it. I’m assuming the best place
would be to go through the rails source related to acts_as_list?

Regarding image, yes I need to rename it to imageable. I’ll do that
soon. Right now, I just needed to correct this bug in my code. Once
everything is working correctly, I’ll work on cleaning it up more.

Thanks again.

Hi Arpan,

I happened to be working in exactly this problem yesterday when you
you message to the list, so I’ve had to work it out too. I found that
longer :scope argments I gave you didn’t work for me. Here’s the model
that I now have working:

class Link < ActiveRecord::Base
belongs_to :linkable, :polymorphic => true
acts_as_list :scope => ‘linkable_id’

class Artist < ActiveRecord::Base
has_many :links, :as => :linkable

As you can see, it works just using the symbol :linkable instead of the
fragment. Let me know if you have any questions about this. In terms of
it works, you would have to read the rails source to find that out

Take care,

class Link < ActiveRecord::Base
belongs_to :linkable, :polymorphic => true
acts_as_list :scope => ‘linkable_id’

Sean I tried that too, but it did not work properly for me. When scope
is set to the ‘linkable_id’, it only works with the ID and does not
take the linkable_type into consideration, causing a clash between
different types, when they have the same ID. Atleast that is what
happend to me. Verify whether it is working properly with the different
types before you use it.

This is the exact line that worked for me:
acts_as_list :scope => ‘image_id=#{image_id} and image_type=#{quote