artisti hanno molte attività (in pratica una cache di interazioni tra gli utenti):c'è un modo per caricare le associazioni delle associazioni polimorfiche?
class Activity < ActiveRecord::Base
belongs_to :receiver, :class_name => 'Artist', :foreign_key => :receiver_id #owns the stuff done "TO" him
belongs_to :link, :polymorphic => true
belongs_to :creator, :class_name => 'Artist', :foreign_key => :creator_id #person who initiated the activity
end
Ad esempio:
Activity.create(:receiver_id => author_id, :creator_id => artist_id, :link_id => id, :link_type => 'ArtRating')
Voglio creare una pagina Attività per ogni artista, costituito da un elenco di diversi tipi di eventi, ArtRatings (piace, non piace), aggiunta ai preferiti, seguito ecc
Il controller è simile al seguente:
class ActivityStreamController < ApplicationController
def index
@activities = @artist.activities.includes([:link,:creator,:receiver]).order("id DESC").limit(30)
end
end
La chiamata db correttamente carica con entusiasmo gli oggetti collegamento polimorfici:
SELECT "activities".* FROM "activities" WHERE (("activities"."receiver_id" = 6 OR "activities"."creator_id" = 6)) ORDER BY id DESC LIMIT 30
ArtRating Load (0.5ms) SELECT "art_ratings".* FROM "art_ratings" WHERE "art_ratings"."id" IN (137, 136, 133, 130, 126, 125, 114, 104, 103, 95, 85, 80, 73, 64)
SELECT "follows".* FROM "follows" WHERE "follows"."id" IN (14, 10)
SELECT "favorites".* FROM "favorites" WHERE "favorites"."id" IN (25, 16, 14)
Ma quando ho visualizzare ogni ArtRating, ho anche bisogno di fare riferimento il titolo del post, che appartiene a un post. Dal punto di vista, se faccio:
activity.link.post
Lo fa una chiamata DB separato per il post di ogni art_rating. C'è un modo per caricare anche il post con impazienza?
AGGIORNAMENTO SULLA QUESTIONE:
Se non v'è alcun modo per ottenere eager loading dei messaggi usando 'include' la sintassi, c'è un modo per farlo manualmente l'eager loading interrogare me stesso e iniettarlo nel @ attività oggetto?
vedo nel registro DB:
SELECT "art_ratings".* FROM "art_ratings" WHERE "art_ratings"."id" IN (137, 136, 133, 130, 126, 125, 114, 104, 103, 95, 85, 80, 73, 64)
C'è un modo per accedere a questa lista di ID dalle @activities oggetto? In tal caso, potrei fare altre 2 query, 1 per ottenere art_ratings.post_id (s) in quell'elenco e un altro per SELEZIONARE tutti i post in quella lista di post_id. Quindi in qualche modo iniettare i risultati "post" in @activities in modo che sia disponibile come activity.link.post quando si itera la collezione. Possibile?
qualsiasi progresso qui? – bogardon
Da quello che ho capito, hai una serie di modelli che dovrebbero essere collegati alle attività come link e io racconto che condividono almeno un'associazione, che è 'post'. C'è forse abbastanza terreno comune in questi modelli di link per usare [Single Table Inheritance] (http://apidock.com/rails/ActiveRecord/Base) e mettere tutto in una tabella? – CMW