La migliore implementazione di un'associazione multi-modello nelle rotaie?
-
10-07-2019 - |
Domanda
Bene, qui Rails Noob: D
Sembra che has__many: through sia l'ultimo modo migliore per gestire molte o molte relazioni, ma sto cercando di mantenerlo semplice. Spero che uno di voi guru là fuori abbia gestito questa situazione prima:
Ecco la configurazione di base del modello che ho ora:
class User < ActiveRecord::Base
has_and_belongs_to_many :products
end
class Product < ActiveRecord::Base
has_and_belongs_to_many :users
has_and_belongs_to_many :clients
end
class Client < ActiveRecord::Base
has_and_belongs_to_many :products
end
Essenzialmente, ho utenti nel sistema che avranno accesso (tramite associazione) a molti prodotti diversi che vengono creati, quei prodotti hanno molti clienti, ma i clienti possono anche far parte di molti prodotti e i Prodotti a cui accedono molti utenti.
Tutte le associazioni stanno funzionando bene, ma ora voglio che gli utenti siano in grado di aggiungere client ai loro prodotti, ma vedo solo i client associati ai prodotti a cui hanno accesso.
Scenario:
Given Bob has access to product A and B
And does NOT have access to product C
And and has clients on product B
And wants to add them to product A.
When in product A Bob should see clients from product B in his add list,
And Bob should not see clients from product C
La mia esperienza noobish con le rotaie non riesce a darmi l'esperienza su come costruire l'array che conterrà il suo elenco di client.
Il modo in cui sto pensando è quello di utilizzare @ bob.products per ottenere i prodotti a cui Bob ha accesso, quindi per raggiungerli e trovare i client associati a ciascun prodotto e poi unirli in un singolo array. Ma è questo il modo MIGLIORE?
Grazie!
Soluzione
Non sono sicuro se questo è ciò che stai cercando, ma se desideri rimuovere tutti i client non autorizzati per un determinato utente:
user = current_user
@clients_access = Array.new
user.products.each {| p | @ Clients_access.push (p.clients) .uniq! }
@ clients_access.flatten!
Altri suggerimenti
Bene, quindi ho raggiunto la funzionalità che desideravo in questo modo:
user = current_user
@clients_no_access = Client.find(:all, :order => :business_name)
user.products.each do |product|
@clients_no_access -= product.clients
end
@all_clients = Client.find(:all,
:order => :business_name) - @clients_no_access - @product.clients
Fondamentalmente, trovare tutti i client, quindi scorrere i prodotti autorizzati collegati e rimuoverli dall'elenco, fondamentalmente creando un elenco di clienti non autorizzati .. quindi ripetere la ricerca e cancellare i clienti non autorizzati e i clienti già assegnati al gruppo .. Ma ho esaurito il nastro isolante .. c'è qualche soluzione migliore?