Ok, então eu tenho três objetos diferentes: uma pessoa, local e equipamento. Cada um pode ter um endereço, na maioria dos casos vários endereços e vários números de telefone. Então meu pensamento é criar as tabelas de objetos específicos, que tenham um endereço e uma tabela de telefone. Aqui está a minha dúvida:
Então, normalmente, no meu mundo SQL, eu teria apenasuma coluna object_id na tabela de endereço e telefone e coloque um id do objeto na coluna de id do objeto e, em seguida, selecione todos os registros de endereço ou telefone que correspondam.
Eu poderia fazer isso, faça find_by_sql e obtenha oregistros, mas prefiro permanecer dentro do paradigma ActiveRecord. Isso significa que devo ter uma coluna id na tabela para cada objeto, portanto, um person_id, place_id, etc.
Qual é a maneira "certa" de modelar isso?
Respostas:
1 para resposta № 1Você pode criar associações polimórficas com registro ativo, para que possa adicionar object_id
e object_type
às tabelas de endereços e números de telefone, e especificando as associações como esta:
class Address
belongs_to :object, :polymorphic => true
end
class PhoneNumber
belongs_to :object, :polymorphic => true
end
class Person
has_many :addresses, :as => :object
has_many :phone_numbers, :as => :object
end
class Place
has_many :addresses, :as => :object
has_many :phone_numbers, :as => :object
end
class Equipment
has_many :addresses, :as => :object
has_many :phone_numbers, :as => :object
end
Deste jeito, Person.first.addresses
deve executar uma consulta como Addresses.where(:object_type => "Person", :object_id => Person.first.id)
e vice-versa para o restante dos modelos e associações.