rails has_many association

时间:2010-11-09 06:51:40

标签: ruby-on-rails

我有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

作品!

2 个答案:

答案 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
相关问题