13 Stimmen

Rails (ActiveRecord) viele-zu-viele-Tabelle

Ich habe zwei Modelle, Benutzer und Gruppen. Jede Gruppe kann viele Benutzer haben und jeder Benutzer kann in vielen Gruppen sein.

Ich habe derzeit etwas Einfaches wie:

Benutzer:

has_many    :groups

Gruppe:

has_many    :users

Ich habe also eine groups_users Tabelle, die gerade Zeilen mit group_id und user_id erstellt. Ich möchte eine weitere Spalte hinzufügen, (die ich habe), die Frage ist, wie ich es von einem Modell zugreifen, ohne einen benutzerdefinierten SQL-Aufruf? Im Gruppenmodell kann ich self.users aufrufen und in user kann ich self.groups aufrufen.

Gibt es eine Möglichkeit, die dritte Spalte in dieser Tabelle über ein Benutzermodell zu ändern?

Bitte entschuldigen Sie, wenn dies verwirrend ist, und bitten Sie um Rat

15voto

dave elkins Punkte 331

Hier finden Sie einige Anleitungen, die Ihnen dabei helfen sollen. Grundsätzlich gibt es zwei Ansätze, damit many-to-many funktioniert, entweder has_and_belongs_to_many oder has_many :through (empfohlen).

Links:

  1. http://blog.hasmanythrough.com/2006/4/20/many-to-many-dance-off
  2. http://railscasts.com/episodes/47-two-many-to-many
  3. http://railscasts.com/episodes/154-polymorphic-association

13voto

bigpotato Punkte 24324

In Rails 3 wollen Sie eine Join-Tabelle für viele-zu-viele-Beziehungen erstellen, indem Sie die Pluralnamen der Tabellen, die Sie verbinden wollen, in alphabetischer Reihenfolge verwenden. In diesem Fall würde es also lauten groups_users .

Modelle

class GroupsUser < ActiveRecord::Base
  belongs_to :user
  belongs_to :group
end

class User < ActiveRecord::Base
  has_many :groups_users
  has_many :groups, :through => :groups_users
end

class Group < ActiveRecord::Base
  has_many :groups_users
  has_many :users, :through => :groups_users
end

4voto

Ethan Punkte 54731

Ich [habe] eine weitere Spalte zu [ users_groups ]...Die Frage ist, wie kann ich ich von einem Modell aus zugreifen, ohne einen einen benutzerdefinierten SQL-Aufruf?

Es klingt, als wollten Sie auf eine Spalte Ihrer user_groups Tabelle, indem Sie eine Methode in Ihrer User Modell oder Ihr Group Modell.

Einige Vorschläge:

Ich würde die Tabelle " nennen user_groups ", um mit den Pluralisierungserwartungen von ActiveRecord zu arbeiten, aber ich bin nicht sicher, ob das notwendig ist.

Wenn Sie Daves Rat befolgen, sollten Sie die Einstellungen mit dem " has_many :through " Technik...

# Declare a Model based on the many-to-many linking table.
class UserGroup < ActiveRecord::Base
  belongs_to :user
  belongs_to :group
end

class User < ActiveRecord::Base
  has_many :user_groups
  has_many :groups, :through => :user_groups
end

class Group < ActiveRecord::Base
  has_many :user_groups
  has_many :users, :through => :user_groups
end

Gibt es eine Möglichkeit, die dritte Spalte in dieser Tabelle über ein Benutzermodell zu ändern?

Dies ist ein wenig unklar, aber bedenken Sie, dass jede User kann eine Menge von UserGroups . Wenn Sie also die dritte Spalte ändern wollen, müssen Sie die gewünschte Spalte finden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X