Notas sobre Ruby e Rails.

associacoes_polimorficas.md 1.9KB

Associações Polimorficas

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