2013-12-20 3 views
2

Итак ... У меня 3 модели.суммируя counter_caches

class Foo < ActiveRecord::Base 
    has_many :bars 
end 

class Bar < ActiveRecord::Base 
    belongs_to :foo 
    has_many :bazs 
end 

class Baz < ActiveRecord::Base 
    belongs_to :bar, counter_cache: true 
end 

Итак, я хотел бы столбец для моего Foo, который ведет себя как bars_count, за исключением того, я хочу, чтобы добавить bazs_count из Bar вместе, вместо .size. Должен ли я идти здесь вручную, с before_save или что-то в этом роде? Есть ли что-то с этой функцией уже в Rails?

Итак, если есть 2 бара ... 1 имеет bazs_count = 4, а другой - bazs_count = 8. Если оба этих бара относятся к foo, я бы хотел иметь bars_count = 12 при изменении bazs_count.

Причина в том, что ... Я часто проверяю, сколько баз имеет конкретное foo, и я бы хотел, чтобы запрос был минимальным.

+0

nops, нет, вы должны сделать это вручную самостоятельно. –

+0

k ... поэтому, когда 'counter_cache' обновляет панель, это фактически не сохраняет, поэтому мой вызов' after_save' на Bar не запускается. Если после этого я 'Bar.find (1) .save', то он правильно обновит Foo. Как это должно быть вызвано? – Dudo

ответ

1

Вы можете добавить следующие модели своей модели Baz, чтобы увеличить и уменьшить столбец bazs_count в вашей модели Foo. Я обнаружил, что Rails pluralises baz для bazs, а не bazes.

class Foo < ActiveRecord::Base 
    has_many :bars 
end 

class Bar < ActiveRecord::Base 
    belongs_to :foo, counter_cache: true 
    has_many :bazs 
end 

class Baz < ActiveRecord::Base 
    belongs_to :bar, counter_cache: true 

    after_create :increment_foo_counter 
    after_destroy :decrement_foo_counter 

    private 

    def increment_foo_counter 
    Foo.increment_counter(:bazs_count, bar.foo_id) 
    end 

    def decrement_foo_counter 
    Foo.decrement_counter(:bazs_count, bar.foo_id) 
    end 
end 
+0

Пригвоздил его. Я попытался сделать еще один напуганный метод, который переписал метод counter_cache. Это делает то, что я сделал, большое спасибо! Приятно видеть в действии метод '.increment_counter' и как его можно так называть. – Dudo

+0

в этом отношении ... если бы я хотел, я мог бы удалить «counter_cache» на Baz, если бы я никогда не позвонил. Очень хорошо. – Dudo

Смежные вопросы