6

Me pregunto si el counter_cache funcionaría en herencia de tabla única.counter_cache en herencia de tabla única

Para estos modelos:

class User 
    has_many :questions 
end 

class Question 
    belongs_to :user, :counter_cache => true 
end 

class SimpleQuestion < Question 
end 
class ComplexQuestion < Question 
end 

Así trabajarán los siguientes contadores?

create_table(:users) do |t| 
    t.integer :questions_count 
    t.integer :simple_questions_count 
    t.integer :complex_questions_count 
end 
  1. Todos ellos trabajan
  2. Ninguno de ellos trabajan
  3. Sólo questions_count trabajo
  4. Sólo simple_questions_count y complex_questions_count

¿Cuál? Supongo que el tercero, pero quiero 4 más. Si no es 4, ¿cómo hago que 4 funcione?

=== === ACTUALIZACIÓN

Aquí se muestra un ejemplo:

id, user_id, question_content, type 
1, 3, something, SimpleQuestion 
2, 3, something, SimpleQuestion 
3, 3, something, ComplexQuestion 

Así que ahora quiero:

user.questions_count # => 3 
user.simple_questions_count # => 2 
user.complex_questions_count # => 1 

Mi pregunta es, ¿cuál es el comportamiento básico de :counter_cache => true y ¿Es posible aplicar en herencia de tabla única?

+0

¿Está intentando que 'simple_questions_count' y' complex_questions_count' devuelvan el mismo número de recuento? ¿O van a contar en función de otro campo de la tabla de preguntas (por ejemplo, el usuario envía si se trata de una pregunta simple o compleja)? – erskingardner

+0

'SimpleQuestion' y' ComplexQuestion' son subclases de 'Question', que tienen' 'type' diferente en la misma tabla. Tal vez dé un ejemplo. – PeterWong

Respuesta

4

Mirando el código fuente donde se implementa ": counter_cache", no parece que admita el tipo de conteo que necesita. Afortunadamente, es fácil hacer los suyos aquí. Sólo actualizar pregunta para rastrear las cuentas manualmente, así:

class Question 
    belongs_to :user 

    after_create :increment_counts 
    before_destroy :decrement_counts 

    protected 

    def increment_counts 
    User.increment_counter :questions_count, user_id 
    User.increment_counter "#{type.pluralize.underscore}_count", user_id 
    end 

    def decrement_counts 
    User.decrement_counter :questions_count, user_id 
    User.decrement_counter "#{type.pluralize.underscore}_count", user_id 
    end 
end 
+0

¿No debería usar 'after_create' en lugar de' after_save'? ¿Quiere decir que el 'counter_cache' no funcionaría para' questions_count'? ¿Qué tal 'simple_questions_count' y' complex_questions_count'? Trabajarían en 'belongs_to: user,: counter_cache => true'? – PeterWong

+0

Sí, tienes razón. Debería ser afer_create, no after_save. Solo un error tipográfico de mi parte. Para questions_count, "counter_cache => true" funcionaría, pero supongo que si va a tener callbacks de contador manual de todos modos, también podría poner ahí la lógica de questions_count.Para simple_questions_count y complex_questions_count, Rails actualmente no ofrece una solución incorporada, para eso están las devoluciones de llamada manuales. –

+0

He actualizado el fragmento de código anterior para corregir el error tipográfico after_create. –

10

simplemente enfrentado la misma situación y que trabajó para mí como se esperaba (num 4):

Mira, modificar su código como este, por lo que las subclases para prevalecer sobre los padres comportamiento:

class User 
    has_many :questions 
end 

class Question 
    belongs_to :user 
end 

class SimpleQuestion < Question 
    belongs_to :user, :counter_cache => true 
end 
class ComplexQuestion < Question 
    belongs_to :user, :counter_cache => true 
end 

y añadir complex_questions_count y simple_questions_count columnas a su User

Eso es todo! cada vez que crea una pregunta, aumentaría el contador adecuado. ¡Lo probé en rieles 3.2!

+0

Esto funcionó para mí en Rails 4.1 –

Cuestiones relacionadas