2017-10-14 4 views
-1

Ich habe zwei Modelle namens Benutzer und PostRails Active Record: Mehrere Benutzer einen Beitrag von einem anderen Benutzer erstellt CRUD

User.rb

class User < ApplicationRecord 
    has_many :posts 
end 

Post.rb

class Post < ApplicationRecord 
    belongs_to :user 
end 

Ab sofort kann ein Benutzer erstellen, zu aktualisieren, einen bestimmten Beitrag löschen.

Ich versuche Active Record tief zu lernen, und ich möchte ein einzelner Beitrag von mehreren Benutzern zugegriffen werden, wenn der Schöpfer der Post will die Post mit vielen Benutzern teilen.

So Admin und Moderator in Beitrag Modell namens Ich hatte geplant, Spalten hinzufügen, admin wird die ID des Benutzers halten, der die Post und Moderator erstellt hatte Komma getrennt IDs des Benutzers, mit denen haben Der Beitrag wird geteilt.

Ist es möglich, dies durch Active Record Verband zu erreichen, wenn möglich, die Assoziation kann ich nutzen?

Ich versuche, es ist nicht ganz klar, Active Record Verbände mit Beispielen aus der Praxis, weil in der Dokumentation zu verstehen.

Ich bin neu in Rails und ich bin mit Rails 5.

+0

Die gegebene Antwort ist perfekt, obwohl es ein besonderer Fall: Wenn Sie die Beiträge der Öffentlichkeit aber nur bearbeitet werden sollen (zerstörbar, ...) durch den Eigentümer, können Sie nur überprüfen, ob aktuelle Post Besitzer die gleichen wie die angemeldeten inhaber. Sie benötigen kein zusätzliches Modell. – Maxence

Antwort

2

Admin wird die ID des Benutzers halten, der die Post und Moderator erstellt haben, wird nach Komma getrennt haben IDs der Benutzer, mit denen der Beitrag wird geteilt.

Dies ist der falsche Weg, dies zu implementieren. Jedes Mal Sie sich entscheiden, eine durch Kommata getrennte Liste zu speichern, von etwas in einer SQL-Spalte, sind Sie wahrscheinlich Ihre Datenbank falsch zu entwerfen.

Ist es möglich, dies durch Active Record Association zu erreichen, wenn möglich welche Zuordnung kann ich verwenden?

Ja, das ist ein extrem typischer Anwendungsfall für ActiveRecord. Sie benötigen eine Viele-zu-Viele-Zuordnung, die einfach durch has_many :through oder has_and_belongs_to_many erreicht wird. In diesem Fall wäre has_many :through die beste Wahl, da Sie der Beziehung zusätzliche Attribute hinzufügen können (z. B. "Moderator" - oder "Admin" -Rechte).

Der Benutzer sollte wie ein PostPermissions Modell Beiträge durch etwas verbunden werden:

class User < ApplicationRecord 
    has_many :post_permissions 
    has_many :posts, through: :post_permissions 
end 

class Post < ApplicationRecord 
    has_many :post_permissions 
    has_many :users, through: :post_permissions 
end 

class PostPermission < ApplicationRecord 
    belongs_to :post 
    belongs_to :user 

    # Permissions can be stored in any number of ways, 
    # an `enum` is one simple approach 
    enum permission: { :moderator, :admin } 
end 

Weitere Einzelheiten der has_many :through section der Führungsactive Vereinigung überprüfen.

Verwandte Themen