artistas tienen muchas actividades (básicamente una memoria caché de las interacciones entre los usuarios):¿hay alguna forma de cargar asociaciones de asociaciones polimórficas ansiosas?
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
Por ejemplo:
Activity.create(:receiver_id => author_id, :creator_id => artist_id, :link_id => id, :link_type => 'ArtRating')
Quiero crear una página de Tráfico de actividad para cada artista, que consiste en una lista de diferentes tipos de eventos, ArtRatings (gustos, disgustos), como favoritos, etc. Siguiendo
El controlador es el siguiente:
class ActivityStreamController < ApplicationController
def index
@activities = @artist.activities.includes([:link,:creator,:receiver]).order("id DESC").limit(30)
end
end
La llamada db correctamente carga con impaciencia los objetos de vínculos polimórficas:
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)
Pero cuando se muestre cada ArtRating, también debe hacer referencia al título de la entrada, que pertenece a un poste. En la vista, si lo hago:
activity.link.post
Hace una llamada de base de datos separada para cada publicación de art_rating. ¿Hay alguna manera de cargar ansiosamente la publicación también?
ACTUALIZACIÓN DE LA PREGUNTA:
Si no hay manera de alcanzar la carga con ganas de mensajes usando 'incluye' sintaxis, es que hay una manera de hacerlo manualmente la carga ansiosa consultar a mí mismo y lo inyecta en el @ actividades objeto?
veo en el 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)
¿Hay alguna manera de que pueda acceder a esta lista de identificadores de los @activities objeto? De ser así, podría hacer 2 consultas adicionales, 1 para obtener las art_ratings.post_id (s) en esa lista, y otra para SELECCIONAR todas las publicaciones EN esa lista de post_id. Luego, de alguna forma, inyecte los resultados de "publicación" en @activities para que esté disponible como activity.link.post cuando repite la colección. ¿Posible?
¿hay algún progreso aquí? – bogardon
Por lo que entiendo, tiene un conjunto de modelos que se supone que están vinculados a actividades como enlaces y creo que todos comparten al menos una asociación, que es 'post'. ¿Hay quizás suficiente terreno común en estos modelos de enlaces para usar [Single Table Herencia] (http://apidock.com/rails/ActiveRecord/Base) y poner todo en una tabla? – CMW