Полиморфные отношения и счетчик кэша - PullRequest
8 голосов
/ 21 марта 2012

Итак, у меня есть приложение с двумя разными моделями, комментариями и ответами, в каждой из которых вы можете согласиться или не согласиться, поэтому у меня есть полиморфная модель, называемая Emotion.Вот мой код для них:

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

Так что все это работает нормально, но мне нужно добавить кэш счетчика для комментариев и ответов, чтобы получить размер Согласен и Не согласендля каждого объекта.Во всех документах есть примеры выполнения счетного кэша с обычными полиморфными ассоциациями, а не с дополнительным условием.Для справки, по схеме Emotion выглядит так:

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 - мне нужно иметь возможность звонить @ commet.agrees_count, @ comment.disagrees_count, @ reply.agrees_count и @ reply.disagrees_countна полиморфную ассоциацию через счетчик кэша.Таким образом, для комментариев и ответов потребуется 2 контрэша.

Ответы [ 3 ]

6 голосов
/ 03 мая 2013

Вы можете добавить атрибут кэша счетчика в список attr_readonly в связанных классах (например, класс 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).
5 голосов
/ 21 марта 2012

Мое предложение заключается в том, чтобы вручную увеличивать или уменьшать кэш счетчика в обратном вызове after_commit, чтобы вы могли проверить, была ли запись сохранена, и она обновляется вне транзакции. Это потому, что это сделает ваш код более явным и менее загадочным в том, как и когда кэш обновляется или становится недействительным.

Кроме того, ручное обновление кэша дает вам дополнительную гибкость, если, например, вы хотите дать некоторым пользователям больше прав, когда они соглашаются или не соглашаются с комментарием (например, системы кармы).

3 голосов
/ 27 мая 2017

Это не бизнес «Полиморфные отношения и счетчик кэша», речь идет о Множественный counter_cache в модели Rails

Кстати, для «Полиморфность отношений и счетчик кэша»

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

в вашей таблице «Issues», у вас должен быть столбец «noteable_count», такой же, как в вашей таблице «коды»

...