Jaka jest różnica między t.belongs_to i t.references w railsach?

123

Jaka jest różnica między t.referencesi t.belongs_to? Dlaczego mamy te dwa różne słowa? Wydaje mi się, że robią to samo? Próbowałem wyszukiwać w Google, ale nie znalazłem wyjaśnienia.

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
źródło
1
Działają tak samo - czy to taka zła rzecz? odwołania wstawiają za ciebie kolumnę klucza obcego. Zamiast tego możesz użyć should_to, aby Twoja migracja była bardziej czytelna. Aby uzyskać więcej informacji, zobacz guide.rubyonrails.org/migrations.html .
muffinista
1
Nie mówienie, że to zła rzecz. Po prostu pomyliłem się, czy działają tak samo, czy na różne sposoby, ponieważ nie mogę znaleźć żadnej dokumentacji, która konkretnie mówi, że działają tak samo. http://guides.rubyonrails.org/migrations.html również nie jest jasne w tej kwestii.
Tornskaden
3
Jest to prawdopodobnie referencesspowodowane tylko wsteczną kompatybilnością i zostanie wycofane i usunięte w przyszłej wersji railsów. Nie wierz mi na słowo, to tylko zgadywanie.
bricker
„Drugi pomocnik nazywany jest odniesień (dostępny także jako belongs_to) W swojej najprostszej formie to po prostu dodaje pewną czytelność” - z przewodnikiem
muffinista
5
Również tutaj jest kod źródłowy - przynależy_to to prosty alias odniesień github.com/rails/rails/blob/ ...
muffinista

Odpowiedzi:

161

Patrząc na kod źródłowy , robią dokładnie to samo - belongs_tojest aliasem 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

Jest to tylko sposób na uczynienie kodu bardziej czytelnym - miło jest móc belongs_tow razie potrzeby umieszczać migracje i trzymać się referencesinnych rodzajów skojarzeń.

muffinista
źródło
Zastanawiam się, czy zamierzają tak to zachować w przyszłości, czy zamierzają usunąć jedną z nich !? Podoba mi się to w ten sposób, że mogę wybrać to, co sprawia, że ​​mój kod wygląda bardziej jak prawdziwy angielski.
Tornskaden,
Przypuszczam, że oboje tu zostaną. Patrząc na dzienniki zatwierdzeń, tak jest od 2007 roku.
muffinista,
4
IMO referencesto niejednoznaczny wybór terminu. Zmienili nazwę before_filterna before_action, co było dobrym posunięciem, ponieważ zmniejszyło niejednoznaczność. Jedną z zalet referencesjest to, że po prostu różni się od tego, którego używasz w modelu, dzięki czemu jesteś mniej zdezorientowany, jeśli jesteś w modelu lub migracji. Ale każdy inny termin spełnia te kryteria.
ahnbizcad
2
IMO referencesto lepszy termin na poziomie db.
vasilakisfil
1
Nie sądzę, żeby tak naprawdę po angielsku mieli na myśli to samo ... Więc to trochę dziwne.
xji