Rails has_many 唯一范围

Rails has_many unique scope

我有两个模型

class Campaign < ApplicationRecord
  has_many :ads
end
class Ad < ApplicationRecord
  belongs_to :campaign
  belongs_to :platform
  validates :platform, uniqueness: { scope: :campaign }
end

基本上,在一个广告系列中我不能有属于同一平台的两个广告。

我想要实现的是找到一种干净的方法来实现一个范围来为每个平台检索广告。 示例:

Campaign.find(1).facebook

Campaign.find(1).ads.facebook

将 return 此活动的唯一 Facebook 广告。

应该在广告系列模型还是广告模型上实施此范围?您会怎么做?

感谢所有想法。谢谢!

您可以在广告模型中创建一个 for_platform 范围

class Ad < ApplicationRecord
  belongs_to :campaign
  belongs_to :platform
  validates :platform, uniqueness: { scope: :campaign }
  scope :for_platform, -> (platform) { where(platform: Platform.find_by(name: platform) }
end

my_campain.ads.for_platform(:facebook).take

如果你想要一个 facebook 方法,你可以用上面的方法和 Campaign

上的 method_missing
class Ad < ApplicationRecord
  belongs_to :campaign
  belongs_to :platform
  validates :platform, uniqueness: { scope: :campaign }
  scope :for_platform, -> (platform) { where(platform: Platform.find_by(name: platform) }
end

class Campaign < ApplicationRecord

  private

  def method_missing(m, *args, @block)
    if Platform.find_by(name: m)
      return ads.for_platform(m).take
    end
    super
  end  
end

my_campain.facebook # assumes there's a platform with name 'facebook'