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'
我有两个模型
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'