In genere sono d'accordo con la tua soluzione e farei lo stesso, cioè creare un modello separato chiamato Share, anche se sembra una soluzione simile a RDBMS.
Ma facciamo un passo indietro e rivediamo le opzioni disponibili.
Prima di tutto, considera le relazioni dei tuoi modelli. Disegnali su un foglio di carta e osserva il tipo di relazioni e le loro associazioni (appartiene a, ne ha una, ne ha molte, ne ha molte attraverso o has_and_belongs_to_many). Il riferimento perfetto per le associazioni nei binari è link . Prendi in considerazione che Mongoid offre anche un tipo di relazioni embedded_in / embeds_many.
Nel tuo caso le relazioni sarebbero: Utente (1..N) Schede per possedere, Schede Utente (N.N) per la condivisione.
Il suggerimento per decidere se usare has_many, has_and_belongs_to_many o embeds_many è se il modello subordinato rappresenta o meno un tipo di relazione semanticamente incorporato e non è connesso ad altri modelli rispetto al suo genitore. È, usa embeds_many, altrimenti usa has_many o has_and_belongs_to_many.
Il suggerimento per decidere se usare has_many: through o has_and_belongs_to_many è se vuoi aggiungere più dati a un modello di collegamento (Condividi nel tuo caso).
has_and_belongs_to_many in mongoid sta facendo senza la creazione di un modello di collegamento, cioè i board_ids sarebbero mantenuti come una matrice nel modello User e user_ids sarebbero mantenuti come una matrice nel modello Board.
Il motivo per non utilizzare HABTM nel tuo caso è semplice. Hai due relazioni tra i tuoi modelli User e Board (condivisione e possessione), avresti difficoltà a capire quale espressione come user.boards
significhi (schede condivise o schede di proprietà). Non conosco un modo semplice per separare questi due tipi di relazioni senza utilizzare un terzo modello (Condividi) come proposto nei commenti (utilizzando :as
, ecc.)
Puoi anche mantenere manualmente gli ID delle schede nel tuo modello utente, in questo modo:
class User
include Mongoid::Document
field :name
key :shared_board_ids, Array, :index => true
key :owned_board_ids, Array, :index => true
def shared_boards
Board.find shared_board_ids
end
# ...
end
Tuttavia, le difficoltà in questo caso si presentano abbastanza velocemente. Devi distruggere manualmente tutti i riferimenti della board dal modello User quando distruggi una board. Se si mantiene un shared_user_ids nel modello Board, si ha ridondanza e un altro insieme di difficoltà.
Quindi, sì, ti consiglio di creare un modello di condivisione separato, come mostrato di seguito.
class User
include Mongoid::Document
field :name
has_many :shares
has_many :boards
end
class Board
include Mongoid::Document
field :title
has_many :shares
belongs_to :user
end
class Share
include Mongoid::Document
belongs_to :user
belongs_to :board
end
Come le autorizzazioni, CanCan è semplice, ma sta andando bene. Si noti una differenza tra l'autenticazione dei termini (che controlla l'autenticità di un utente, in altre parole controlla che l'utente sia realmente chi afferma di essere, normalmente utilizzando la password) e l'autorizzazione (che controlla i diritti dell'utente). L'autenticazione è gestita da gemme come Authlogic, Warden (e Devise basato su Warden), Stregoneria. L'autorizzazione è gestita da Declarative_authorization o CanCan.