рельсы has_many ассоциации - PullRequest
0 голосов
/ 09 ноября 2010

у меня 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

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

Вот мой юнит тест

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

работает!

Ответы [ 2 ]

0 голосов
/ 09 ноября 2010

Что вам нужно сделать, это использовать опцию 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
0 голосов
/ 09 ноября 2010

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

def gen_gamma
  alpha.gammas.create
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...