Respostas:
Faça manualmente:
add_column :post, :author_id, :integer
mas agora, quando você cria a instrução belongs_to, precisará modificá-la, então agora você deve chamar
def post
belongs_to :user, :foreign_key => 'author_id'
end
schema_plus
gem, t.references :category, index: true, foreign_key: true, references: :match_categories
também funcionou para mim no arquivo de migração.
Se você estiver definindo sua Post
tabela de modelos, poderá definir references
, index
e foreign_key
em uma linha:
t.references :author, index: true, foreign_key: { to_table: :users }
Se você estiver adicionando referências a uma tabela existente, poderá fazer o seguinte:
add_reference :posts, :author, foreign_key: { to_table: :users }
Nota: O valor padrão para index
é verdadeiro.
null
s. Para não permitir, adicione a opção usual null: false
.
No Rails 4.2+, você também pode definir chaves estrangeiras no banco de dados, o que é uma ótima idéia .
Para associações simples, isso também pode ser feito na t.references
adição foreign_key: true
, mas neste caso você precisará de duas linhas.
# The migration
add_reference :posts, :author, index: true
add_foreign_key :posts, :users, column: :author_id
# The model
belongs_to :author, class_name: "User"
references: :users
opção na add_reference
chamada. Não o vejo documentado nos documentos e parece funcionar do meu lado sem ele.
No rails 4, ao usar o postgresql e a gema schema_plus, você pode simplesmente escrever
add_reference :posts, :author, references: :users
Isso criará uma coluna author_id
, à qual corretamente se refere users(id)
.
E no seu modelo, você escreve
belongs_to :author, class_name: "User"
Observe que, ao criar uma nova tabela, você pode escrevê-la da seguinte maneira:
create_table :things do |t|
t.belongs_to :author, references: :users
end
Nota: a
schema_plus
gema em sua totalidade não é compatível com os trilhos 5+, mas essa funcionalidade é oferecida pela gema schema_auto_foreign_keys (parte do schema_plus) que é compatível com os trilhos 5.
create_table
:t.references :author, references: :users
:references
realmente faça alguma coisa.
schema_plus
gema há muito tempo e, na verdade, ela está adicionando essa funcionalidade. Eu editei minha resposta de acordo.
t.references :col_name, references: other_table_name
funciona sem a instalação de gemas extras.
Se você não estiver usando uma chave estrangeira, não importa qual seja o nome da tabela real da outra tabela.
add_reference :posts, :author
No Rails 5 , se você estiver usando uma chave estrangeira, poderá especificar o nome da outra tabela nas opções de chave estrangeira. (consulte https://github.com/rails/rails/issues/21563 para discussão)
add_reference :posts, :author, foreign_key: {to_table: :users}
Antes do Rails 5, você deveria adicionar a chave estrangeira como uma etapa separada:
add_foreign_key :posts, :users, column: :author_id
{to_table: :users}
alias_attribute (new_name, old_name) é muito útil. Basta criar seu modelo e o relacionamento:
rails g model Post title user:references
edite o modelo e adicione um alias de atributo com
alias_attribute :author, :user
Depois disso, você poderá executar coisas como
Post.new(title: 'My beautiful story', author: User.first)