2016-05-19 4 views
0

In meiner App können Benutzer Produkte so im Moment User has_many :products und Product belongs_to :user erstellen. Jetzt möchte ich, dass der Ersteller des Produkts product.user andere Benutzer einladen kann, dem Produkt beizutreten, aber ich möchte, dass der Ersteller der einzige ist, der das Produkt bearbeiten kann.Schienen Join Tabelle Problem mit verschiedenen Rollen (Besitzer, Nicht-Besitzer)

Eines der Setups, die ich in meinem Kopf habe, ist dies, aber ich denke, es würde nicht funktionieren, da ich nicht weiß, wie zwischen erstellten und "beitreten-Einladung" -Produkten beim Aufruf user.products zu unterscheiden .

User 
has_many :products, through: :product_membership 
has_many :product_memberships 
has_many :products # this is the line I currently have but think it wouldn't 
        # work with the new setup 

Product 
has_many :users, through: :product_membership 
has_many :product_memberships 
belongs_to :user # I also have this currently but I'd keep the user_id on the product 
       # table so I could call product.user and get the creator. 

ProductUsers 
belongs_to :user 
belongs_to :product 

Invitation 
belongs_to :product 
belongs_to :sender, class: "User" 
belongs_to :recipient, class: "User" 

, um dieses Problem zu umgehen ich von 2 Lösungen denken kann:

  1. die Linie User has_many :products Loswerden, dass ich zur Zeit und einfach eine Instanz Methode zum user Modell ergänzt:

    def owned_products 
        Product.where("user_id = ?", self.id) 
    end 
    

    Mein Problem damit, dass ich denke, dass es nicht der Konvention folgt.

  2. Entfernen der User has_many :products Zeile, die ich derzeit habe und Hinzufügen einer booleschen Spalte zu den 'ProductUsers' is_owner? genannt. Ich habe das vorher nicht versucht, also bin ich mir nicht sicher, wie das funktionieren würde.

Was ist die beste Lösung, um dieses Problem zu lösen? Wenn keine von diesen dann bitte lassen Sie mich wissen, was Sie empfehlen. Ich möchte später auf einige Probleme nicht eingehen, weil mein DB-Schema vermasselt ist.

Antwort

0

Sie könnten der ProductUsers-Tabelle ein admin oder creator-Attribut hinzufügen und es standardmäßig auf false setzen und für den Ersteller auf true festlegen.

EDIT: das ist, was Sie is_owner? genannt haben Dies scheint eine ziemlich gute Lösung für mich zu sein, und würde Ihnen leicht erlauben, den Schöpfer zu finden.

product.product_memberships.where(is_owner?: true)

sollten Sie die Schöpfer