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

Я хочу, что всякий раз, когда создается новая бета-версия, то также должна быть новая гамма. Оба связаны с альфой.

Вот мой блок тест

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

В тесте, используйте '!' версия 'save':' a.save! '. Любые ошибки? И поставить точку останова на 'gen_gamma': это вызов? – Zabba

+0

даже сэкономить! нет гамм, но обратный вызов называется. Я также экспериментировал с опцией автосохранения или перезагрузкой альфы, но не успел – gschaden

ответ

0

Вы строите гамму, но не сохраняете альфу, которая также сохранит гамму. Вы можете использовать create вместо build на вашей гамме, чтобы решить эту проблему. В отличие от build, create сохраняет запись.

def gen_gamma 
    alpha.gammas.create 
end 
+0

Но, Alpha сохраняется (по 'a.save') правильно? Кроме того, если «a.betas» сохраняется, почему не сохраняется «a.gammas»? Кажется, что 'gen_gamma' не вызван или какая-то другая проблема. Что дает? – Zabba

+0

gen_gamma вызывается, проверяется с помощью «puts called», похоже, что навигация в обратном вызове alpha.gammas.build не обозначает новые гамма, которые нужно сохранить. – gschaden

0

Что вам нужно сделать, это использовать inverse_of опцию has_many:

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_create в Alpha:

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

    def gen_gamma 
    gammas.build 
    end 
end 
Смежные вопросы