Rails有许多独特的作用域(_M)



我有两种型号的

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'

相关内容

  • 没有找到相关文章

最新更新