6

所以我有一個應用程序與2個不同的模型,評論和回覆,其中每一個你可以同意或不同意,所以我有一個稱爲情感多態模型。這是我對這些代碼:多態關係和計數器緩存

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 

所以這一切工作正常,但我將需要添加計數器緩存都評論和回覆,以獲得規模的同意和不同意對每個目的。在所有的文檔中,它都有使用正常多態關聯執行計數器緩存的示例,而不是一個具有額外條件的示例。作爲參考,由架構情緒看起來是這樣的:

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

我的建議是在after_commit回調中手動遞增或遞減計數器緩存,以便您可以測試記錄是否持久,並在事務之外更新。這是因爲它會讓你的代碼更加明確,並且對緩存更新或失效的方式和時間不那麼神祕。

此外,手動更新緩存給您額外的靈活性,例如,如果您想在某些用戶同意或不同意評論(例如業力系統)時給予某些用戶更多的權限。

4

您可能希望將計數器緩存屬性添加到關聯類(例如,類Post; attr_readonly:comments_count; end)中的attr_readonly列表中。 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

它仍然不適合我 – kamal 2015-10-20 16:47:30

1

這是 '多態關係和反緩存' 的無業務,它是關於Multiple counter_cache in Rails model

順便說一句,對於 '多態關係和反緩存'

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 

在你的表'問題'中,你應該有'noteable_count'這一列,與你的表'代碼'相同