2010-11-09 96 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