我有两种型号的
class Campaign < ApplicationRecord
has_many :ads
end
class Ad < ApplicationRecord
belongs_to :campaign
belongs_to :platform
validates :platform, uniqueness: { scope: :campaign }
end
基本上,在一个活动中,我不能有两个属于同一平台的广告。
我试图实现的是找到一种干净的方式来实现一个范围,为每个for平台检索广告。示例:
Campaign.find(1).facebook
或
Campaign.find(1).ads.facebook
将返回此活动的唯一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'