簡體   English   中英

Rails / ActiveRecord:has_one,belongs_to和before_create

[英]Rails/ActiveRecord: has_one, belongs_to and before_create

我在弄清楚如何最好地建模數據時遇到了麻煩。 我的Rails應用程序中有以下兩個模型:

class Foo < ActiveRecord::Base
  belongs_to :active_bar, :class_name => 'Bar'
  accepts_nested_attributes_for :active_bar

  before_create do |f|
    f.active_bar.foo = f

    # Causes stack overflow!
    f.active_bar.save!
  end
end

class Bar < ActiveRecord::Base
  belongs_to :foo
end

test 'create with nested attributes' do
  f = Foo.create!(:name => 'foo-name', :active_bar_attributes => {:name => 'bar-name'})
  assert_equal 'foo-name', f.name
  assert_equal 'bar-name', f.active_bar.name
  assert_equal f, f.active_bar.foo

  f_id = f.to_param

  retrieved_f = Foo.find_by_id!(f_id)
  assert_equal retrieved_f, retrieved_f.active_bar.foo
end

什么,你可能覺得很奇怪是自反belongs_to關系,我試圖建模。 我的計划是,最終, Foo將具有Bar許多實例,而一個實例將被視為“活動”。 因此,我正在使用active_bar來引用此活動實例。 這段代碼的問題是,我需要將Barfoo屬性設置回父Foo實例,並且我無法找出執行此操作的最佳位置( before_createsave!調用最終是遞歸的,並且溢出了堆棧),即使這是對這種類型的關系進行建模的最簡潔的方法。

本質上,我正在嘗試為具有多個電子郵件地址(相當於Bar )的用戶(相當於Foo )建模,並將其中一個電子郵件地址標記為用戶的主要地址。

有什么建議?

如果您可以的話,我將就用戶名和電子郵件地址做出回應;)

在您的用戶模型中,實際上應該是has_many :email_addresseshas_one :active_email, :class_name => 'EmailAddress'並且如您所正確識別的那樣, accepts_nested_attributes_for :email_addresses

然后,EmailAddress模型當然應該具有belongs_to :User

除了這些,我認為您正在考慮過多。 然后,在創建用戶的表單中,允許他們輸入所需數量的電子郵件地址,或者讓他們首先放置“活動”電子郵件,或者進行某種形式的切換以指示哪個電子郵件地址是其主要地址。

編輯:就before_create語句而言,我認為只需要簡單驗證一下是否已指定/標記了主要電子郵件地址(如果有必要首先指定一個電子郵件地址)。

如果這不能滿足您所需的功能,請發表評論。 我會盡力幫助。

暫無
暫無

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

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