2017-03-21 23 views
0

私はキャンペーン素材モデルです。子モデル内で親オブジェクトIDを取得するにはどうすればよいですか?入れ子式

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が含まれているリンクで、この属性のコードを記入したいです。

キャンペーンのの中身のモデルですか?

UPDATE

申し訳ありませんが、私は非常によく説明していませんでした。各材料は、1つのキャンペーンのためであるので、上記材質モデルでは、私は中にコード属性を移入する親IDを取得することはありません:campaignsbelongs_to :campaign

答えて

0

before_saveコールバックとself.campaign.idを使用して解決しました。私のユーザーが入力した情報を操作するメソッド内に親IDを取得します。

1

「キャンペーンのプロセスを作成する」...単数形を使いたいです。

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呼び出しでこれを修正することができます材料のcode属性を必要なIDで更新できます。

+0

申し訳ありませんが、問題は非常にうまく説明できませんでした。私は質問を更新しました。 –

+0

あなたの質問に私の編集がお役に立てば幸いです。 – SteveTurczyn

関連する問題