Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Dúvida modelagem/associações

Pessoal, Estou seguindo o curso junto com a apostila da Caelum e li toda documentação do rails relacionada às associações, mas estou com dúvida na melhor forma de modelar uma aplicação.

Minha aplicação tem um modelo de usuários e um modelo de restaurantes. Tanto os usuários quanto os restaurantes possuem apenas um endereço.

Tabela de restaurantes

create_table "restaurants", force: :cascade do |t|
 t.string   "nome"
 t.text     "descricao"
 t.string   "email"
 t.string   "telefone"
 t.integer  "categoria_id"
 t.datetime "created_at",     null: false
 t.datetime "updated_at",     null: false
end

Tabela de usuários

create_table "users", force: :cascade do |t|
 t.string   "primeiro_nome"
 t.string   "sobrenome"
 t.string   "email"
 t.datetime "created_at",     null: false
 t.datetime "updated_at",     null: false
end

Minha dúvida é a seguinte, pesando que os endereços dos restaurantes teriam que ter duas colunas a mais (latitude e longitude). Qual a melhor abordagem para modelar? Estou em dúvida se é o caso de criar duas tabelas separadas de endereços, uma com endereços para restaurantes e outra com endereços para usuários (ABORDAGEM 1) ou de criar uma associação polimórfica com uma tabela de endereços tanto para os usuários quanto para os restaurantes e criar uma tabela só com as coordenadas e vincular apenas aos restaurantes (ABORDAGEM 2).

ABORDAGEM 1

Tabela de endereço para usuários

 create_table "user_addresses", force: :cascade do |t|
    t.string   "logradouro"
    t.string   "bairro"
    t.string   "cidade"
    t.string   "uf"
    t.string   "complemento"
    t.string   "cep"
    t.integer  "user_id"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
    t.string   "numero"
    t.index ["user_id"], name: "index_addresses_on_user_id"
  end

tabela de endereços para restaurantes

```
 create_table "restaurant_addresses", force: :cascade do |t|
    t.string   "logradouro"
    t.string   "bairro"
    t.string   "cidade"
    t.string   "uf"
    t.string   "complemento"
    t.string   "cep"
    t.decimal  "longitude"
    t.decimal "latitude"
    t.integer  "restaurant_id"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
    t.string   "numero"
    t.index ["restaurant_id"], name: "index_addresses_on_user_id"
  end

ABORDAGEM 2 -> Neste caso a tabela de endereços não teria as colunas de coordenadas e eu separaria elas em outra tabela.

Associação polimórfica

class User
  has_one :address, as: :addressable
end

class Restaurant
  has_one :address, as: :addressable
  has_one:coordinate
end

class Address
  belongs_to :addressable, polymorphic: true
end

Para finalizar, caso nenhuma dessas abordagens seja a melhor, o que vocês recomendariam? (considerando que sou bem novato nesse universo de desenvolvimento).

1 resposta
solução!

Eu gosto da ideia de entidades diferentes.. vai ficar mais fácil para vc. Daria para rolar uma polimorfica, mas minha experiência com polimorfica me diz que ela atrapalha mais que ajuda.