如何在子模型中获取父对象id?嵌套表格

时间:2017-03-21 15:18:20

标签: ruby-on-rails ruby activerecord model nested-forms

我有广告系列材料模型。

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以填充代码属性

2 个答案:

答案 0 :(得分:1)

belongs_to :campaign而非:campaigns ...使用单数形式,因为每种材料都适用于一个广告系列。

定义belongs_tohas_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来操纵用户输入的信息。