1

2 つのモデルがあり、1 つは別のモデルに属していますが、それらを適切に保存できないようです。build問題は、モデルでメソッドを使用すると、メモリ内でモデルが互いに割り当てられないため.save、親を呼び出そうとすると、子に親の ID が設定されていないという事実に起因します。そして失敗します。

親モデルは次のとおりです。

#  id             int(11)
#  execution_id   int(11)
#  macro_type_id  int(11)
#  macro_key_id   int(11)
#  created_at     datetime
#  updated_at     datetime

class ExecutionMacro < ActiveRecord::Base
  belongs_to :execution
  belongs_to :macro_type
  belongs_to :macro_key
  has_one :advertisement_execution, :dependent => :destroy
  accepts_nested_attributes_for :advertisement_execution

  attr_accessible :macro_key_id, :macro_type_id, :advertisement_execution_attributes

  validates :execution, :presence => true
  validates :macro_type, :presence => true
  validates :macro_key, :presence => true
end

これが子供です:

#  id                        int(11)
#  advertisement_id          int(11)
#  execution_macro_id        int(11)
#  advertisement_version_id  int(11)
#  created_at                datetime
#  updated_at                datetime
#  deleted_at                datetime

class AdvertisementExecution < ActiveRecord::Base
  belongs_to :advertisement
  belongs_to :advertisement_version
  belongs_to :execution_macro

  attr_accessible :advertisement_id, :advertisement_version_id, :execution_macro_id

  validates :execution_macro, :presence => true
  validates :advertisement, :presence => true
  validates :advertisement_version, :presence => true
end

したがって、次のコードを試してみると:

@execution = Execution.find(1)
@em = @execution.execution_macros.build(:macro_type_id => 1, :macro_key_id => 1)
@ae = @em.build_advertisement_execution(:advertisement_id => 1, :advertisement_version_id => 1)
if @em.save
  "do something"
else
  "throw an error"
end

「Advertisement Execution: Execution Macro can't be blank.」というメッセージが表示され、保存に失敗します。

これはそれほど難しいことではないように感じます。私は何が欠けていますか?

4

1 に答える 1

1

トリックは、build_advertisement_execution を呼び出す間、@em がデータベースに保存されないことです。この場合、@em.id と @ae.id は (永続化されていないため) nil に等しいため、@ae.execution_macro_id と @em.advertisement_execution_id も nil に設定されます。私の提案は、検証ロジックを再考するか、advertising_execution を作成する前に検証せずに execution_macros を保存することです (.save(validate: false) を参照)。

于 2012-12-04T21:21:18.190 に答える