/ / RnR: normalização de banco de dados, modelos de rails e associações - ruby-on-rails-3, activerecord, rails-migrações, associações de modelos

RnR: Normalização de banco de dados, modelos e associações de trilhos - ruby-on-rails-3, activerecord, rails-migrations, associações de modelos

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 № 1

Você 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.