2017-11-05 1 views
1

Ich habe eine User und MeetOption Tabelle. Dies ist eine viele-zu-viele-Beziehung, und ich war in der Lage eine Join-Tabelle mit dem create_join_table Befehl zu erstellen:Schienen 5: Hinzufügen Datensatz zu Join-Tabelle ohne Modell (has_and_belongs_to_many)

rails g migration CreateJoinTableUsersMeetOptions users meet_options

Diese Migrationsdatei generiert:

class CreateJoinTableUsersMeetOptions < ActiveRecord::Migration[5.0] 
    def change 
    create_join_table :users, :meet_options do |t| 
     # t.index [:user_id, :meet_option_id] 
     # t.index [:meet_option_id, :user_id] 
    end 
    end 
end 

Ich habe auch die Assoziation zwischen Modellen Benutzer und meet_option Verwendung has_and_belongs_to_many

class User < ActiveRecord::Base 
    has_and_belongs_to_many :meet_options 
#More codes below 
end 

class MeetOption < ApplicationRecord 
    has_and_belongs_to_many :users 
end 

Die Zuordnung funktioniert einwandfrei, und ich kann zum Beispiel user.meet_options in Rails-Konsole abfragen.

Meine Frage ist: Es gibt kein Modell für die beigefügte MeetOptionsUsers Tabelle, also wie kann ich Datensätze hinzufügen? Im Moment muss ich manuell Zeilen hinzufügen, d. H. user_id = 1; meet_option_id = 2, unter Verwendung einer GUI-Datenbanksoftware (Postico).

Gibt es eine Möglichkeit, Datensätze wie MeetOptionUser.create(user_id: 1, meet_option_id: 2) in Rails-Konsole hinzuzufügen, genau wie wenn ein ActiveRecord-Modell zugeordnet ist?

Antwort

1

Mit einer has_and_belongs_to_many-Beziehung sollten Sie in der Lage sein, die normalen Active Record-Assoziationsmethoden zu verwenden, um Ihre Users und MeetOptions miteinander zu verknüpfen. Sie sollten die Join-Tabelle nicht direkt bearbeiten müssen. Rails kümmert sich darum für Sie. Die Ruby on Rails Guide has_and_belongs_to_many Association Reference listet alle nützlichen Methoden auf, die automatisch von dieser Zuordnung erstellt werden.

Hier sind einige Methoden, die Sie nützlich finden können.

Die collection<<(object,..) fügt der Join-Tabelle ein oder mehrere Objekte hinzu. Zum Beispiel:

@user.meet_options << @meet_option 

Die oben assoziiert vorgesehen @meet_option Datensatz mit @user indem Sie den entsprechenden Eintrag in der Tabelle beitreten hinzufügen. In diesem Fall wird ein Datensatz mit user_id: @user.id und meet_option_id: @meet_option.id der Join-Tabelle hinzugefügt. Der umgekehrte erreicht das gleiche:

@meet_option.users << @user 

Eine weitere nützliche Methode ist collection.delete(object,...). Auf diese Weise können Sie Verknüpfungen aus der Join-Tabelle entfernen. Die zugehörigen Objekte werden nicht gelöscht. Zum Beispiel:

@user.meet_options.delete @meet_option 

Die oben werden die Assoziation zwischen @user und @meet_option durch Löschen des entsprechenden Datensatz aus der Join-Tabelle entfernen. Es löscht jedoch weder @user aus der users Tabelle, noch löscht es @meet_option aus der meet_options Tabelle.

collection.destroy(object,...) macht ziemlich genau dasselbe wie collection.delete(object,...).

collection=(objects) wird die Sammlung nur die bereitgestellten Objekte enthalten, indem sie bei Bedarf aus der Join-Tabelle hinzufügen oder löschen.

Es gibt viele andere Verwendungsmethoden in dieser Assoziation. Ich empfehle die Überprüfung der verknüpften guide. Mit diesen Methoden sollten Sie in der Lage sein, die Join-Tabelle zu verwalten, ohne sie direkt zu manipulieren. Lassen Sie Rails und Active Record die Arbeit für Sie erledigen.

letzter Gedanke

Wenn Sie über ein Join-Modell einer direkteren Zugriff auf die Join-Tabelle haben, sollten die Sie nicht die has_and_belongs_to_many Vereinigung verwenden. Vielleicht möchten Sie Ihrer Join-Tabelle weitere Attribute hinzufügen oder Validierungen oder Rückrufe für das Join-Modell selbst haben. In diesem Fall sollten Sie stattdessen eine has_many :through association verwenden. This blog post führt durch, wie man das aufstellt.

+0

Ausgezeichnete Antwort. Ich konnte den von Ihnen erwähnten Schaufeloperator '' 'verwenden, um Datensätze zur Join-Tabelle hinzuzufügen. 'option = MeetOption.find_by (Name: 'Mentorship')' ' user.meet_options << option' Es funktioniert auch mit mehreren meet_option Artikel sowie ' Optionen = MeetOption.all' 'Benutzer. meet_options << options' –

+0

Ich habe viele Verwendungen von 'has_many: through' im gesamten Projekt, aber dieses Mal muss ich eine einfache Viele-zu-Viele-Beziehung haben, und die Join-Tabelle wird keine anderen Attribute enthalten. Gute Gedanken, danke. –

+0

Kein Problem. Froh, dass ich Helfen kann. –

Verwandte Themen