9

CONTESTO:ambito personalizzato su has_many,: attraverso l'associazione (Rails 4)

Nel mio setup Gli utenti hanno molte comunità attraverso CommunityUser e Comunità hanno molti messaggi attraverso CommunityPost. Se segue, gli utenti hanno molti messaggi attraverso le comunità.

User.rb

has_many :community_users 
has_many :communities, through: :community_users 
has_many :posts, through: :communities 

Ciò premesso User.rb, Calling "current_user.posts" restituisce i messaggi con una o più comunità in comune con current_user.

DOMANDA:

sto cercando di perfezionare tale associazione in modo che chiamare "current_user.posts" restituisce solo i messaggi le cui comunità sono un sottoinsieme completo delle comunità del CURRENT_USER.

Quindi, dato un utente corrente con community_ids di [1,2,3], chiamando "current_user.posts" restituirebbe solo quei post la cui matrice "community_ids" è o 1, [2], [3], [1] , 2], [1,3], [2,3] o [1,2,3].

Ho fatto ricerche portate here, ma non riesco a individuare come eseguire questa operazione con successo ...

risposta

9

Nizza domanda ...

miei pensieri immediati:

-

ActiveRecord Association Extension

si tratta in sostanza permettono di creare una serie di metodi per le associazioni , Che consente di determinare i criteri specifici, come questo:

#app/models/user.rb 
has_many :communities, through: :community_users 
has_many :posts, through: :communities do 
    def in_community 
     where("community_ids IN (?)", user.community_ids) 
    end 
end 

-

Conditional Association

Si potrebbe utilizzare in condizioni di vostra associazione, in questo modo:

#app/models/user.rb 
has_many :posts, -> { where("id IN (?)", user.community_ids) }, through: :communities #-> I believe the model object (I.E user) is available in the association 

-

Source

Originariamente ho pensato che questo sarebbe la soluzione migliore, ma guardando più a fondo, credo che sia solo se si desidera utilizzare un nome diverso associazione

Specifica il nome dell'associazione di origine utilizzato per has_many: attraverso interrogazioni. Usalo solo se il nome non può essere dedotto dall'associazione . has_many: subscriber, tramite:: le iscrizioni appariranno su per: abbonati o: abbonato su Abbonamento, a meno che non sia disponibile una fonte: .


essere onesti, questa è una di quelle domande che ha bisogno di alcuni pensavano

In primo luogo, come stai archiviano/chiamando l'array community_ids? È memorizzato nel db direttamente o è accessibile tramite il metodo ActiveRecord Model.association_ids?

In attesa di aiutare ulteriormente!

+0

Ciao, ci scusiamo per il ritardo! Ho pensato che questa domanda avrebbe richiesto un po 'di tempo per ottenere una risposta dal momento che richiede qualche riflessione come hai detto. Sì, sto utilizzando Rails e utilizzo dei metodi ActiveRecord per community_ids. – neon

+0

Come lei ha ricordato che l'utente è disponibile utilizzando associazione condizionale: "has_many: i messaggi, -> (utente) {dove (" id IN()? "User.community_ids)}, attraverso:: comunità", ma in questo caso wouldn Devo anche controllare le comunità di ogni post in qualche modo? Sto solo pensando ad alta voce. – neon

+0

Sidenote: fare "dove (" id IN() "user.community_ids?)" Come questo tornerà messaggi associati a una qualsiasi delle 'user.community_ids', piuttosto che tornare i messaggi associati con le comunità che sono un sottoinsieme completo di " user.community_ids " – neon

0

Non mostrare le definizioni di modello e di relazione per per Community o CommunityPost quindi assicuratevi di avere un has_many :community_posts e un has_many :posts, through: :community_posts del modello Community e belongs_to :community e un belongs_to :post su CommunityPost. Se non c'è bisogno di tenere traccia di qualsiasi cosa sul ComunityPost si potrebbe utilizzare un has_and_belongs_to_many :posts su Community e un join tavolo communities_posts contenente solo le chiavi esterne community_id e post_id.

Supponendo di avere la configurazione relazioni come ho descritto si dovrebbe essere in grado di utilizzare solo current_user.posts per ottenere un rapporto che può essere ulteriormente incatenato e che restituisce tutti i messaggi per tutte le comunità l'utente è associato a quando si chiama .all su di esso. Tutti i metodi di classe (come ad esempio i metodi di ambito) definite il vostro modello Post sarà anche richiamabile da quella relazione così che è dove si dovrebbe mettere i parametri a meno che tali perfezionamenti riguardano la Community o CommunityPost nel qual caso li mettereste sul Community o CommunityPost modelli rispettivamente. In realtà, è raro che sia necessaria un'estensione della relazione AR per gli ambiti, poiché in genere si desidera anche perfezionare il modello indipendentemente dal modello correlato che si può utilizzare per raggiungerlo.

Problemi correlati