9

Ich bin neu bei Schienen und versuche, eine Viele-zu-viele-Beziehung in meinem Schienenprojekt einzurichten. Ich habe eine kleine Strategie, aber ich bin mir nicht sicher, ob es der richtige Weg ist.Wie viele-zu-viele-Beziehungen in Schienen haben

Ziel: Ich habe eine Tabelle von Benutzern und eine Tabelle von Gruppen. Benutzer können Teil vieler Gruppen sein, und jede Gruppe kann viele Benutzer haben.

Strategie:

  1. Teiln.einrichten Migration Namen haben: string
  2. Gruppe Migration einrichten Namen haben: string
  3. eine Migration Join-Tabelle
  4. einrichten Benutzer einrichten Modell so, dass es has_and_belongs_to_many hätte: Gruppen
  5. Richten Sie das Gruppenmodell so ein, dass es has_and_belongs_to_many: users
  6. hätte

Wäre dies die richtige Strategie? Vielen Dank!

Railcast Zusammenfassung von Antwort: Für diejenigen, die interessiert sind - Railcast empfiehlt Ihnen, eine has_many zu nutzen: durch die Verbindung, da die Strategie über die Begrenzung hat, dass Sie keine zusätzlichen Beziehung spezifische Informationen hinzufügen können.

Check-out: http://kconrails.com/tag/has_many/

Antwort

14

Zuerst nehme ich an, Sie haben ein Benutzer-Modell mit einem Feld "name" und einer Gruppe-Modell mit einem Feld "Name".

Sie benötigen ein Modell zwischen Benutzern und Gruppen. Nennen wir es die Gruppierung:

rails g model grouping user_name:string group_name:string 

In der Gruppierung-Modell (grouping.rb), setzen Sie:

belongs_to :user 
belongs_to :group 

Im User-Modell:

has_many :groupings, :dependent => :destroy 
has_many :groups, :through => :groupings 

Und in der Gruppe -model:

has_many :groupings, :dependent => :destroy 
has_many :users, :through => :groupings 

In der _form-Datei zu bearbeiten oder zu aktualisieren ein Benutzerprofil, setzen Sie:

<div class="field"> 
    <%= f.label :group_names, "Groups" %> 
    <%= f.text_field :group_names %> 
</div> 

Und schließlich muss die Nutzer-Klasse wissen, was mit den Informationen aus der Form zu tun. Legen Sie in user.rb:

attr_writer :group_names 
    after_save :assign_groups 

    def group_names 
    @group_names || groups.map(&:name).join(' ') 
    end 

    private 

    def assign_groups 
    if @group_names 
     self.groups = @group_names.split(/\,/).map do |name| 
     if name[0..0]==" " 
      name=name.strip 
     end 
     name=name.downcase 
     Group.find_or_create_by_name(name) 
     end 
    end 
    end 

assign_groups Leerzeichen entfernt und downcases alle Wörter, so dass Sie nicht redundante Tags haben.

Nun können Sie die Gruppen für einen Benutzer in der Show-Datei von seinem Profil zeigen:

<p>Groups: 
    <% @user.groups.each do |group|%> 
    <%= group.name %> 
    <% end %> 
</p> 

Hope, das hilft.

+0

Warum haben wir: dependent =>: für Gruppierungen zerstören? – Karan

+3

, weil der Benutzer nicht mehr in der Gruppe ist, wenn Sie den Benutzer oder die Gruppe löschen. – tmaximini

+0

Warum nicht die Beziehung ['has_and_belongs_to_many'] (http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association) verwenden? Es würde den gesamten Prozess vereinfachen, wenn keine zusätzlichen Felder in der Zwischentabelle erforderlich sind. – ferdynator

3

Die gute Nachricht ist, dass dies bereits gut dokumentiert.

Ruby on Rails Guide

Railscast tutorial

+0

Danke! Der Railcast hat wirklich geholfen. – Karan

+0

Danke, ich fand die Dokumentation, auf die Sie verwiesen haben, sehr nützlich. Mir gefiel auch die Antwort @The_Fritz, da sie ein prägnantes Beispiel liefert. –