我有3个简单的模型
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回调,但不保存关联的gamma,同时保存beta。
奇怪的是那个
a = Alpha.new
b = a.betas.build
g = a.gammas.build
a.save
作品!
答案 0 :(得分:0)
您正在构建gamma但不保存alpha,这也会保存gamma。您可以在gamma上使用create
代替build
来解决该问题。与build
不同,create
会保存记录。
def gen_gamma
alpha.gammas.create
end
答案 1 :(得分: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