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 commentshas_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
endErzeugte Methoden
Ein has_many :comments stellt Ihnen eine Sammlung mit praktischen Methoden bereit:
post.commentszum Lesen.post.comments.create(...)zum Hinzufügen eines verknüpften Datensatzes.post.comments.countzum Zählen.post.comment_idsfür die IDs.
post = Post.find(1)
post.comments.create(body: "First!")
puts post.comments.counthas_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
endViele-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
endOptionen 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: :destroylöscht auch die untergeordneten Datensätze.dependent: :nullifyleert deren Fremdschlüssel.dependent: :restrict_with_errorverhindert das Löschen.
class Post < ApplicationRecord
has_many :comments, dependent: :destroy
endDas 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
endN+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
endEigene 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"
endKurzer Test
Testen Sie Ihr Verständnis von Associations.
Zusammenfassung: Associations
Sie haben gelernt, Modelle miteinander zu verknüpfen:
belongs_toenthält den Fremdschlüssel;has_manyundhas_onebilden die andere Seite ab.has_many throughbildet Viele-zu-viele-Beziehungen ab.dependentsteuert 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.