My understanding of polymorphic associations is you have a an id column and 
a type column (which must be a model name):

# attachable_id   [Integer]
# attachable_type [String]
class Asset < ActiveRecord::Base
  belongs_to :attachable, polymorphic: true
end

class Post < ActiveRecord::Base
  has_many :assets, as: :attachable
end

While this is nice in terms of simplicity, it can be somewhat limiting.

I would like the option to have my type column be an id pointing to another 
model, that could have the class name as column there:

# attachable_id      [Integer]
# attachable_type_id [Integer]
class Asset < ActiveRecord::Base
  belongs_to :attachable_type
  belongs_to :attachable, polymorphic: true
end

class Post < ActiveRecord::Base
  has_many :assets, as: :attachable
end

# model_name [String]
class AttachableType < ActiveRecord::Base
end



The advantages for me are:

   - Model name changes only need to happen in one place in the db
   - The ability to add a foreign key constraint on type column
   - Use up less space with an integer column instead of a text one
   
I'm currently working on a moderately large Rails app that uses a lot of 
single-table inheritance, and am looking to replace it with polymorphism.


While I can do that with the existing functionality, abstracting my list of 
types into its own table (with extra metadata) would add a lot of 
convenience.


Please let me know if this sounds reasonable.

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/rubyonrails-core.
For more options, visit https://groups.google.com/d/optout.

Reply via email to