2010-11-09 157 views
0

我有3個簡單的模型導軌的has_many協會

class Alpha < ActiveRecord::Base 
    has_many :betas 
    has_many :gammas 
end 

class Beta < ActiveRecord::Base 
    belongs_to :alpha  
    before_create :gen_gamma 

    def gen_gamma 
    gamma = alpha.gammas.build 
    gamma 
    end 
end 

class Gamma < ActiveRecord::Base 
    belongs_to :alpha 
end 

我想的是,只要創建一個新的Beta版,這也應該是一個新的Gamma值。兩者都與alpha相關聯。

這裏是我的單元測試

require 'test_helper' 

class BetaTest < ActiveSupport::TestCase 
    test "creating a beta should create a gamma" do 
    a = Alpha.new 
    b = a.betas.build 
    a.save 
    assert a.gammas.size > 0, "alpha should have gammas" 
    end 
end 

的before_create回調函數被調用,但是相關的伽馬不會被保存,而β被保存。

奇怪的是,

a = Alpha.new 
b = a.betas.build 
g = a.gammas.build 
a.save 

作品!

+0

在測試中,使用''''''保存':'a.save!'版本。任何錯誤?並在'gen_gamma'上放置一個斷點:它是否被調用? – Zabba 2010-11-09 07:01:41

+0

即使保存!沒有gammas,但回調被稱爲。我也嘗試過自動保存選項,或者重新加載alpha,但沒有成功 – gschaden 2010-11-09 08:10:20

回答

0

您正在構建伽瑪但不保存阿爾法,這也將保存伽馬。您可以使用create而不是您的伽馬上的build來解決該問題。與build不同,create保存該記錄。

def gen_gamma 
    alpha.gammas.create 
end 
+0

但是,Alpha正在被保存(通過'a.save')嗎?另外,如果'a.betas'正在保存,爲什麼不保存'a.gammas'?好像'gen_gamma'沒有被調用,或者其他一些問題。是什麼賦予了? – Zabba 2010-11-09 07:31:52

+0

gen_gamma被調用,使用「puts called」進行測試,它看起來像回調中的導航alpha.gammas.build不標記要保存的新gammas。 – gschaden 2010-11-09 08:06:31

0

你需要做的是使用上has_manyinverse_of選項:

class Alpha < ActiveRecord::Base 
    has_many :betas, :inverse_of => :alpha 
    has_many :gammas, :inverse_of => :alpha 
end 

class Beta < ActiveRecord::Base 
    belongs_to :alpha, :inverse_of => :betas 
    before_create :gen_gamma 

    def gen_gamma 
    alpha.gammas.build 
    end 
end 

class Gamma < ActiveRecord::Base 
    belongs_to :alpha, :inverse_of => :gammas 
end 

或者更簡單的方式,將before_createAlpha

class Alpha < ActiveRecord::Base 
    has_many :betas 
    has_many :gammas 
    before_create :gen_gamma 

    def gen_gamma 
    gammas.build 
    end 
end