0Pricing
Ruby Academy · Lektion

Assoziationen

has_many und belongs_to

Assoziationen ist eine kostenlose Ruby Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Ruby Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Ruby Academy-Kurs umfasst insgesamt 4 Lektionen.

Was sind Associations?

Associations deklarieren Beziehungen zwischen Modellen, sodass Active Record zugehörige Zeilen für Sie durchsuchen kann. Statt SQL für Joins zu schreiben, rufen Sie Methoden wie user.posts auf.

  • Sie bilden die Fremdschlüssel in Ihrer Datenbank ab.
  • Sie erzeugen automatisch Hilfsmethoden.
  • Sie sorgen dafür, dass der Code wie die Fachdomäne lesbar ist.

belongs_to

belongs_to gibt an, dass dieses Modell einen Fremdschlüssel enthält, der auf ein anderes Modell verweist. Ein Comment, der zu einem Post gehört, besitzt eine Spalte post_id.

class Comment < ApplicationRecord
  belongs_to :post
end

# comment.post returns the parent Post
# Requires a post_id column on comments

has_many

has_many bildet die andere Seite ab: Ein Datensatz besitzt viele Datensätze eines anderen Modells. Ein Post besitzt viele Comment-Datensätze. Der Fremdschlüssel befindet sich auf der Seite mit den vielen Datensätzen.

class Post < ApplicationRecord
  has_many :comments
end

# post.comments returns all related comments
# post.comments.create(body: "Nice!")

Wo sich der Fremdschlüssel befindet

Das Modell mit belongs_to enthält den Fremdschlüssel. Bei Post und Comment besitzt die Tabelle comments die Spalte post_id. Richten Sie dies in einer Migration mit t.references :post oder add_reference ein.

create_table :comments do |t|
  t.references :post, foreign_key: true
  t.text :body
  t.timestamps
end

Erzeugte Methoden

Ein has_many :comments stellt Ihnen eine Sammlung mit praktischen Methoden bereit:

  • post.comments zum Lesen.
  • post.comments.create(...) zum Hinzufügen eines verknüpften Datensatzes.
  • post.comments.count zum Zählen.
  • post.comment_ids für die IDs.
post = Post.find(1)
post.comments.create(body: "First!")
puts post.comments.count

has_one

has_one bildet eine 1:1-Verknüpfung ab, etwa zwischen einem User und einem Profile. Der Fremdschlüssel befindet sich weiterhin im anderen Modell (profiles.user_id).

class User < ApplicationRecord
  has_one :profile
end

class Profile < ApplicationRecord
  belongs_to :user
end

Viele-zu-viele mit through

Für eine Viele-zu-viele-Beziehung verwenden Sie ein Verbindungsmodell und has_many through. Ein Student besitzt viele Course-Datensätze über Enrollment-Zeilen.

class Student < ApplicationRecord
  has_many :enrollments
  has_many :courses, through: :enrollments
end

class Enrollment < ApplicationRecord
  belongs_to :student
  belongs_to :course
end

Optionen für abhängige Datensätze

Legen Sie mit dependent fest, was beim Löschen eines übergeordneten Datensatzes mit den untergeordneten Datensätzen geschieht:

  • dependent: :destroy löscht auch die untergeordneten Datensätze.
  • dependent: :nullify leert deren Fremdschlüssel.
  • dependent: :restrict_with_error verhindert das Löschen.
class Post < ApplicationRecord
  has_many :comments, dependent: :destroy
end

Das N+1-Abfrageproblem

Wenn Sie Datensätze durchlaufen und dabei auf eine Association zugreifen, kann für jeden Datensatz eine eigene Abfrage ausgeführt werden: das gefürchtete N+1-Problem. Das Laden von 10 Beiträgen und anschließend deren Kommentaren kann 11 statt 2 Abfragen ausführen.

Dadurch werden Anwendungen bei wachsendem Datenbestand unbemerkt langsamer.

# N+1: one query per post for comments
Post.all.each do |post|
  puts post.comments.count
end

N+1 mit includes beheben

includes weist Active Record an, die Association mit wenigen Abfragen vorab zu laden, statt viele einzelne Abfragen auszuführen. Das ist die Standardlösung für N+1.

Post.includes(:comments).each do |post|
  puts post.comments.count
end

Eigene Namen mit class_name

Wenn der Name der Association nicht mit dem Modell übereinstimmt, verwenden Sie Optionen wie class_name und foreign_key. Ein Beispiel ist eine Association namens author, die auf dem Modell User basiert.

class Post < ApplicationRecord
  belongs_to :author, class_name: "User"
end

Kurzer Test

Testen Sie Ihr Verständnis von Associations.

Zusammenfassung: Associations

Sie haben gelernt, Modelle miteinander zu verknüpfen:

  • belongs_to enthält den Fremdschlüssel; has_many und has_one bilden die andere Seite ab.
  • has_many through bildet Viele-zu-viele-Beziehungen ab.
  • dependent steuert kaskadierende Löschvorgänge.
  • Vermeiden Sie N+1-Abfragen mit includes.

Als Nächstes stellen Sie mit Validierungen die Datenintegrität sicher und lernen, Abfragen zu erstellen.

Häufig gestellte Fragen

Ist die Lektion „Assoziationen“ kostenlos?

Ja — der vollständige Text von „Assoziationen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Ruby Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Ruby Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Assoziationen“?

has_many und belongs_to Du übst Ruby Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Ruby Academy zu starten?

Keine Vorkenntnisse erforderlich. Ruby Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.

Wie lange dauert die Lektion „Assoziationen“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Ruby Academy-Lektion Code schreiben und ausführen?

Ja. Jede Ruby Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Active-Record-Grundlagen
  2. Migrationen
  3. Assoziationen
  4. Validierungen und Abfragen
← Zurück zu Ruby Academy