Quem sou eu

Recommend Me

Meu nome é Davis Zanetti Cabral, tenho 23 anos, sou muito bem casado, tenho uma filha linda, sou programador e atuo na área de Desenvolvimento Web há mais de 8 anos. Atualmente trabalho em casa e presto serviços em Ruby on Rails, PHP e xHTML/CSS. Saiba mais

STI e Polymorphic associations

Maio 03, 2008 @ 02:00 PM

Essa semana me deparei com um problema: meus modelos que herdavam do modelo User, faziam parte de uma associação polimórfica, onde cada tipo distinto de usuário, poderia ter um vepiculo. Esse problema é documentado no manual, e para utilizar STI com associações polimórficas é necessário uma pequena alteração no seu modelo.

O meu problema era, que ao chamar current_user.vehicles.find ele pesquisava por veículos com owner_type igual a User.

Quando utilizo associações polimórficas, eu preciso de dois campos para isso, o campo que armazena o código, id, e o campo que armazena o tipo, type. Como minha associação se chama owner, meu modelo possui dois campos owner_id e owner_type.

Mas na hora do meu cadastro, o tipo armazenado no veículo era Manager, que é um modelo STI de User.

Para o uso de associações polimórficas com STI eu preciso de um pequeno ajuste no meu modelo Vehicle para que ele armazene a classe base do objeto que estiver sendo fornecido como owner, como está no código abaixo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Vechile < ActiveRecord::Base
  belongs_to :owner, :polymorphic => true

  def owner_type=(sType)
     super(sType.to_s.classify.constantize.base_class.to_s)
  end
end

class User < ActiveRecord::Base
  has_many :vehicles, :as => :owner, :dependent => :destroy
end

class Manager < User
end

class Administrator < User
end

Desculpe, os comentários para esse artigo estão fechados devido ao número de SPAMs que tenho recebido.