我有广告系列和材料模型。
class Campaign < ApplicationRecord
has_many :materials
accepts_nested_attributes_for :materials, reject_if: :all_blank, allow_destroy: true
end
和
class Material < ApplicationRecord
belongs_to :campaign
def code=(val)
new_code = val
suffixes = %w(.png .jpg .jpeg .gif .bmp)
urls = URI.extract(new_code, ['http', 'https'])
urls.each do |url|
new_code = new_code.gsub(url, "#{url}&var1=#{self.campaign.id}") unless url.ends_with? *suffixes #<--- (this is not working
end
write_attribute(:code, new_code)
end
end
材料有一个代码属性,我想用一个包含相关广告系列的ID的链接填充此属性代码,在创造它时。
如何在材料模型中获取对象广告系列?
更新
对不起,我没解释得很好。在上面的材料模型中,我希望在“创建广告系列流程”期间获取父ID以填充代码属性
答案 0 :(得分:1)
它belongs_to :campaign
而非:campaigns
...使用单数形式,因为每种材料都适用于一个广告系列。
定义belongs_to
和has_many
会自动为您提供检索对象的方法。
my_material = Material.first
my_material.campaign # <- this gives you the campaign object
my_material.campaign_id # <- this gives you the campaign object's id
my_material.campaign.id
# ^ another way, slightly less efficient but more robust as you no longer need to know how the records are coupled
如果您已进入create campaign
流程并且您没有坚持该广告系列,那么您就没有合适的ID,但您可以使用{ {1}}回调可以更新资料的广告系列&#39;具有必要ID的after_save
属性。
答案 1 :(得分:0)
使用before_save
回调和self.campaign.id
解决问题,以获取方法中的父ID来操纵用户输入的信息。