簡體   English   中英

rails has_many協會

[英]rails has_many association

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

作品!

您正在構建伽瑪,但不保存Alpha,這也會保存伽瑪。 您可以使用create而不是在gamma上build來解決該問題。 build不同, create保存記錄。

def gen_gamma
  alpha.gammas.create
end

您需要做的是在has_many上使用inverse_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_create移到Alpha

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

  def gen_gamma
    gammas.build
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM