Alias of Table?

I'm attempting to convert a legacy application.

I need to do what amounts to a "alias filter" on a table. The table - call it 'Assets' - has many name-value pairs as its public data. It is shared by many other tables, so the key is

     parent_id, parent_class

This is a one-way association: "Assets of X", where "X" can be another table.

In base SQL this is easy - set up an alias

My Question- ow to do this in Rails: Is there a way to filter for a 'parent' class so this can be shared?

Class OneThing < AR::B    has_many :assets # where asset.parent_class = 'OneThing'

Class AnotherThing < AR::B    has_many :assets # where asset.parent_class = 'AnotherThing'

So how to make this 'automated' for the CRUD and how to define the 'Setting' class? Can 'Asset' somehow belong_to more than one model?

I've no problem drawing the E-R diagram :slight_smile: or thinking what the explicit and long winded SQL would be, but I don't have the Rail experience to see this.

I can see docco on 'has_and_belongs_to_many' using an intermediate join table, but this is a one way association.

Thanks /a

Josh Susser said the following on 02/04/2007 12:06 PM:

Rails does this using something called a polymorphic association. It's the only explicit support in Rails for composite foreign keys. Your foreign key is composed of the values parent_id and parent_type. The class name of the parent model is stored as a string in parent_type.

You set this up using the :polymorphic => true option on the :parent association

  belongs_to :parent, :polymorphic => true

Then in the various classes, use :as => :parent on the has_many

  has_many :assets, :as => :parent

That seems odd to me, but what do I know. If I knew I wouldn't be asking :slight_smile:

So this would work:

class Asset < AR:B    belongs_to :parent, :polymorphic => true

   def set(name, value)    end

   def value_of(name)    end end

class Person < AR:B    has_many :assets, :as => :parent end

class Corporation < AR:B    has_many :assets, :as => :parent end

class Bank < Corporation    has_many :assets, :as => :parent end

class Government < AR:B    has_many :assets, :as => :parent end

class CIA < AR:B    has_many :assets, :as => :parent end

class Harry <AR:B    has_many :assets, :as => :parent

   def make_my_asset(date, punkname)        assetname = date.to_string        ....    end end

There are a few limitations related to this being a one-way association.

That's OK, I suppose, so long as you want to know the assets belonging to something and not who owns a particular asset.

You can't do eager loading of parents, and has_many :through needs some help to be useful. Otherwise it works pretty well.

Help? useful? By 'help' do you mean if one of the parents needed to create or delete an asset? Or does Rails 'magically' fill in the parent_id and parent_class somehow.

Would it help if these parents were a subclass of an AssetOwner class?