Qual é a diferença entre t.belongs_to e t.references em rails?


123

Qual é a diferença entre t.referencese t.belongs_to? Por que estamos tendo essas duas palavras diferentes? Parece-me que eles fazem a mesma coisa? Tentei algumas pesquisas no Google, mas não encontrei explicação.

class CreateFoos < ActiveRecord::Migration
  def change
    create_table :foos do |t|
      t.references :bar
      t.belongs_to :baz
      # The two above seems to give similar results
      t.belongs_to :fooable, :polymorphic => true
      # I have not tried polymorphic with t.references
      t.timestamps
    end
  end
end

1
Eles funcionam da mesma maneira - isso é uma coisa tão ruim? referências insere uma coluna de chave estrangeira para você. Em vez disso, você pode usar o belongs_to para tornar sua migração mais legível. Consulte guias.rubyonrails.org/migrations.html para obter mais detalhes.
— Muffinista 17/10/11

1
Não estou dizendo que é uma coisa ruim. Fiquei confuso sobre se eles funcionam da mesma maneira ou de maneiras diferentes, pois não consigo encontrar documentação específica dizendo que eles funcionam da mesma maneira. http://guides.rubyonrails.org/migrations.html também não está claro sobre esse assunto.
— Tornskaden 17/10/11

3
Provavelmente, isso é apenas para compatibilidade com versões anteriores e referencesserá descontinuado e removido em uma versão futura dos trilhos. Não aceite minha palavra, é apenas um palpite.
— bricker

"O outro helper é chamado de referências (também disponível como belongs_to) Na sua forma mais simples, apenas acrescenta alguns legibilidade" - a partir da guia
— muffinista

5
Também aqui está o código-fonte - belongs_to é um alias de reta de referências github.com/rails/rails/blob/...
— muffinista

Respostas:


161

Observando o código fonte , eles fazem exatamente a mesma coisa - belongs_toé um alias de reference:

  def references(*args)
    options = args.extract_options!
    polymorphic = options.delete(:polymorphic)
    args.each do |col|
      column("#{col}_id", :integer, options)
      column("#{col}_type", :string, polymorphic.is_a?(Hash) ? polymorphic : options) unless polymorphic.nil?
    end
  end
  alias :belongs_to :references

Essa é apenas uma maneira de tornar seu código mais legível - é bom poder fazer belongs_toas migrações quando apropriado e seguir referencesoutros tipos de associações.


Gostaria de saber se eles continuarão assim no futuro ou se eles removerão um deles !? Eu gosto dessa maneira, poder escolher o que fizer meu código parecer mais com inglês de verdade.
— Tornskaden 17/10/11

Eu acho que ambos estão aqui para ficar. Observando os logs de confirmação, tem sido assim desde 2007. #
— muffinista 17/10/11

4
IMO, referencesé uma escolha ambígua para um termo. Eles renomearam before_filterpara before_action, o que foi uma boa jogada porque reduziu a ambiguidade. Uma vantagem referencesé que ele é simplesmente diferente do que você usa no modelo, para que você fique menos confuso se estiver no modelo ou na migração. Mas qualquer termo que diferir satisfaria esse critério.
— ahnbizcad 12/09

2
IMO referencesé um termo melhor no nível de banco de dados.
— precisa saber é o seguinte

1
Eu realmente não acho que eles realmente significam a mesma coisa em inglês ... Então é um pouco estranho.
— xji
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.