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
Tornskaden
fonte
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.

muffinista
fonte
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