6

Así que tengo una aplicación con 2 modelos diferentes, Comentarios y Respuestas, cada uno de los cuales puede estar de acuerdo o en desacuerdo, entonces tengo un modelo polimórfico llamado Emoción. Aquí está mi código para éstos:Relaciones polimórficas y contador de caché

class Comment < ActiveRecord::Base 
    belongs_to :user 
    has_many :replies 
    has_many :emotions, :as => :emotionable 
end 



class Reply < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :comment 
    has_many :emotions, :as => :emotionable 
end 

class Emotion < ActiveRecord::Base 
    belongs_to :emotionable, :polymorphic => :true 
end 

Así que todo esto funciona bien, pero voy a tener que añadir un contador de caché tanto comentario y Responder con el fin de obtener el tamaño del acuerdo y desacuerdo para cada Objeto. En todos los documentos, tiene ejemplos para hacer un contador de caché con asociaciones polimórficas normales, no uno con una condición adicional. A modo de referencia, mediante el esquema de emoción se ve así:

create_table "emotions", :force => true do |t| 
    t.integer "user_id" 
    t.string "emotion" 
    t.integer "emotionable_id" 
    t.string "emotionable_type" 
    t.datetime "created_at",  :null => false 
    t.datetime "updated_at",  :null => false 
end 

TL: DR - Tengo que ser capaz de llamar @ commet.agrees_count, comment.disagrees_count @, @ @ reply.agrees_count y reply.disagrees_count en una asociación polimórfica a través de un contador de caché. Así que Comment and Reply necesitará 2 cachés de contador.

Respuesta

3

Mi sugerencia sería incrementar o disminuir manualmente su contador de caché en una devolución de llamada after_commit para que pueda probar si el registro se mantuvo y se actualiza fuera de la transacción. Esto se debe a que hará que su código sea más explícito y menos misterioso sobre cómo y cuándo se actualiza o invalida la memoria caché.

También la actualización manual de la memoria caché le da flexibilidad adicional si, por ejemplo, desea dar más autoridad a algunos usuarios cuando están de acuerdo o en desacuerdo con un comentario (por ejemplo, sistemas de karma).

4

es posible que desee agregar el atributo de caché de contador a la lista attr_readonly en las clases asociadas (por ejemplo, clase Post; attr_readonly: comments_count; end). http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/belongs_to

:polymorphic 

    Specify this association is a polymorphic association by passing true. 
    Note: If you’ve enabled the counter cache, then you may 
    want to add the counter cache attribute to the attr_readonly list in 
    the associated classes 
    (e.g. class Post; attr_readonly :comments_count; end). 
+0

Todavía no funcionó para mí – kamal

1

no es asunto del negocio de 'relaciones polimórficas y caché contador', se trata de Multiple counter_cache in Rails model

Por cierto, para los 'relaciones polimórficas y contador de caché'

class Code < ActiveRecord::Base 
    has_many :notes, :as => :noteable 
end 

class Issue < ActiveRecord::Base 
    has_many :notes, :as => :noteable 
end 

class Note < ActiveRecord::Base 
    belongs_to :noteable, polymorphic: true, count_cache: :noteable_count 
end 

en los 'problemas' de su tabla, debe tener la columna 'noteable_count', igual que la tabla 'códigos'

Cuestiones relacionadas