Associações polimorficas servem para criar um modelo que pertence a varios outros modelos. Por exemplo, uma classe de comentarios que está associada a varios modelos como posts, fotos e eventos.
$ rails g model comment content:text commentable_id:integer commentable_type
Esse primeiro comando gera o modelo para os comentarios. As ultimas duas variaveis servem para guardar o id e o tipo de objeto que o comentario pertence.
Para melhorar a performance do sistema de comentarios, adicione o commentable_id
e o commentable_type
no index da tabela no arquivo de migração db/migrations/xxxxxxxxxxxxxx_create_comments.rb
:
classCreateComments < ActiveRecord::Migration
defchange
create_table :commentsdo |t|
t.text :content
t.belongs_to :commentable, polymorphic: true
t.timestamps
end
add_index :comments, [:commentable_id, :commentable_type]
end
end
No exemplo acima, as duas variaveis commentable_id
e o commentable_type
foram substituidas por t.belongs_to :commentable, polymorphic: true
. Esse é outro metodo de declarar as associações polimorficas.
Rode o comando $ rake db:migrate
para criar a nova tabela no banco de dados.
Entre no modelo dos comentarios app/models/comment.rb
e adicione a associação e retire os atributos que não são necessarios:
classComment < ActiveRecord::Base
attr_accessible :content
belongs_to :commentable, polymorphic:true
end
Depois, adicione o outro lado da associação para cada modelo que vai ter comentarios:
classPost < ActiveRecord::Base
attr_accessible :title, :content
has_many :comments, as: :commentable
end
Com isso agora é possivel criar e acessar comentarios igual a qualquer outra associação.
Para criar o CRUD do sistema de comentarios, primeiro crie um controlador:
$ rails g controller comments index new