2016-07-28 6 views
0

ich mit dem cancancan Juwel für Schienencancancan eine Beziehung verwalten Rails

gem 'cancancan', '~> 1.10' 

Ich habe vier Modelle in ein Problem leite: User, Unternehmen, Standorte, Gruppen

Benutzer: Gehört zur Firma Unternehmen : Hat Lage viele Standorte: Gruppe gehört das Unternehmen:

im Fähigkeiten Modell gehört Ort habe ich dieses:

can :manage, Group, :location => {:id => user.company.locations.map{|l| l.id}} 

Wenn Erstellen einer neuen Gruppe I verweigert bin

(keinen Zugriff haben) ich für die richtige Art und Weise suchen, damit ein Benutzer, eine Gruppe mit einer der Firmen Standort-IDs (Anmerkung erstellen: Ohne Cancan auf das alles funktioniert und alle IDs sind verwandt und so weiter).

Antwort

1

Um sicherzustellen, dass ich das Verständnis Ihrer Frage ganz ...

Sie suchen nach einem Weg, um die Fähigkeit eines Benutzers zu begrenzen Gruppen basierend auf den Standorten der Gesellschaft zu verwalten, dass Benutzer gehört?

Angenommen, ich habe das richtig, empfehle ich #pluck mit würde:

can :manage, Group, location_id: user.company.locations.pluck(:id) 

Dieser sammelt all :id ‚s auf einen Standort des Unternehmens des Benutzers und sorgt für einen Benutzer nur Gruppen verwalten kann, die eine haben: location_id in dieser Sammlung enthalten.

Funktionell ist dies identisch zu dem, was Sie getan haben, ist jedoch effizienter auf zwei Arten:

  1. Es beinhaltet keine unnötige Logik Rubin

  2. Mit #pluck nur Abfragen der :id an einer Stelle, im Gegensatz zu der gesamten Lage und all ihre Attribute

Wenn Sie in Rails auf Ihre Datenbank zugreifen, sollten Sie dies generell mit ActiveRecord-Methoden tun. Dies verhindert, dass Sie Zeit damit verschwenden, nach zusätzlichen Informationen zu suchen, die Sie nicht benötigen, und den zusätzlichen Aufwand für die Verwendung von Ruby zur Neustrukturierung Ihrer Daten zu vermeiden.

Hoffe, dass hilft!

+0

Danke! Ihr Vorschlag zum Pflücken ist genau das, wonach ich gesucht habe! Ich kann jedoch immer noch keine Gruppe erstellen. Wenn ich versuche zu erstellen, zeigt es mir, dass ich keinen Zugriff auf diese Ressource habe. – gregwinn

+0

Hmm ... Um es noch einmal zu überprüfen, versuchen Sie, eine Gruppe für einen Standort zu erstellen, der zu einem Unternehmen gehört, zu dem Ihr Benutzerkonto gehört, oder? Wenn Cancancan richtig eingerichtet ist, können Sie nur eine Gruppe erstellen, wenn es eine location_id hatte, die in der Sammlung der Standorte Ihres Unternehmens vorhanden war. Wenn die Gruppe, die Sie erstellen möchten, nicht über die erforderliche location_id verfügt, sollte sie Sie * ablehnen. – H12

+0

Richtig, ich habe weitere Details unten eingefügt: def group_params params.erfordern (Gruppe) .permit (Name,: location_id) Ende erstellen Methode: @ group.create (group_params) .save Params im dev Protokoll gesendet: ' "Gruppe"=> { "name" => "Test"}, "button" => "", "location_id" => "1"} ' – gregwinn

Verwandte Themen