我如何提出对`counter_cache`的唯一请求

时间:2019-01-31 21:16:20

标签: ruby-on-rails ruby-on-rails-5

所以,我有两个模型CampaignCampaignSubscription

CampaignSubscription模型
 我有这种关系

belongs_to :campaign, inverse_of: :campaign_subscriptions, counter_cache: true, required: true

我没有唯一数量的订阅。

belongs_to :campaign, inverse_of: :campaign_subscriptions, required: true

counter_culture :campaign, column_name: proc { |model|
self.where(lead_id: model.lead_id, campaign_id: model.campaign_id).count > 1 ? nil : 'campaign_subscriptions_count' }

但是我认为这是错误的,并且会导致N + 1。

现在,当用户创建下一个CampaignSubscription对象时,我没有收到唯一数量的订阅。我需要使用户的唯一订阅数(领导)。如何更简洁地组织代码?

1 个答案:

答案 0 :(得分:1)

我将其定义为广告系列订阅类上的一种方法,而不是尝试某种计数器缓存。我只会在父模型上使用计数器缓存来描述一个简单的一对多计数(可能使用发布为L:true的过滤器),而不是用于计数同一表中的相关记录。为此使用模型方法:

def some_describing_method_name
  campaign.campaign_subscriptions.pluck(:lead_id).uniq.count
end