Você precisa adicionar uma tabela de junção separada com apenas um restaurant_id
e user_id
(sem chave primária), em ordem alfabética .
Primeiro execute suas migrações e, em seguida, edite o arquivo de migração gerado.
Rails 3
rails g migration create_restaurants_users_table
Trilhos 4 :
rails g migration create_restaurants_users
Rails 5
rails g migration CreateJoinTableRestaurantUser restaurants users
Dos documentos :
Há também um gerador que produzirá tabelas de junção se JoinTable fizer parte do nome:
Seu arquivo de migração (observe o :id => false
; é o que impede a criação de uma chave primária):
Rails 3
class CreateRestaurantsUsers < ActiveRecord::Migration
def self.up
create_table :restaurants_users, :id => false do |t|
t.references :restaurant
t.references :user
end
add_index :restaurants_users, [:restaurant_id, :user_id]
add_index :restaurants_users, :user_id
end
def self.down
drop_table :restaurants_users
end
end
Rails 4
class CreateRestaurantsUsers < ActiveRecord::Migration
def change
create_table :restaurants_users, id: false do |t|
t.belongs_to :restaurant
t.belongs_to :user
end
end
end
t.belongs_to
irá criar automaticamente os índices necessários. def change
irá detectar automaticamente uma migração para frente ou para trás, sem necessidade de up / down.
Rails 5
create_join_table :restaurants, :users do |t|
t.index [:restaurant_id, :user_id]
end
Nota: Também existe uma opção para um nome de tabela customizado que pode ser passado como um parâmetro para criar_join_tabela chamada table_name
. Dos documentos
Por padrão, o nome da tabela de junção vem da união dos dois primeiros argumentos fornecidos para create_join_table, em ordem alfabética. Para personalizar o nome da tabela, forneça uma opção: table_name:
restaurant_id
. O segundo ajudará se você estiver procurandouser_id
. Se você estiver pesquisando em ambos, acho que o banco de dados seria inteligente o suficiente para precisar de apenas um. Então eu acho que o segundo realmente não precisa ser combinado. Este foi mais apenas um exemplo. Essa era uma pergunta do Rails, portanto, postar na seção DB renderia uma resposta mais completa.rails g migration create_restaurants_users
sem mesa no final.As respostas aqui são bastante antigas. A partir do Rails 4.0.2, suas migrações fazem uso de
create_join_table
.Para criar a migração, execute:
Isso irá gerar o seguinte:
Se você deseja indexar essas colunas, descomente as respectivas linhas e pronto!
fonte
unique: true
a ela. Isso evitará que relacionamentos duplicados sejam criados.Ao criar a tabela de junção, preste muita atenção ao requisito de que as duas tabelas precisam ser listadas em ordem alfabética no nome / classe de migração. Isso pode incomodar você facilmente se os nomes de seus modelos forem semelhantes, por exemplo, "abc" e "abb". Se você fosse correr
Suas relações não funcionarão como esperado. Você deve usar
em vez de.
fonte
Para relacionamentos HABTM, você precisa criar uma tabela de junção. Existe apenas uma tabela de junção e essa tabela não deve ter uma coluna de id. Experimente esta migração.
Você deve verificar estes tutoriais de guia de trilhos de relacionamento
fonte