如何获取子模型中的父对象 ID?嵌套形式

How can I get the parent object id inside the child model? Nested form

我有一个 Campaign 和一个 Material 模特。

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

Material有一个属性code,我想用link填充这个属性代码在创建时包含相关 广告系列 的 ID。

如何在 Material 模型中获取对象 Campaign

更新

对不起,我没有解释清楚。在上面的 Material 模型中,我想获取父 ID 来填充代码属性,在 "create campaign process"

它是 belongs_to :campaign 而不是 :campaigns ...使用单数,因为每个 material 代表一个活动。

定义 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,但您可以使用 after_save 来解决这个问题在活动中回调,可以使用必要的 ID 更新 materials 的 code 属性。

使用 before_save 回调和 self.campaign.id 在方法中获取父 ID 来处理我的用户输入的信息来解决它。