一起验证和保存相关模型

时间:2014-04-23 10:50:10

标签: ruby-on-rails rails-activerecord

我有2个相关模型,我需要一起验证和创建它们。

应用

class Application < ActiveRecord::Base
  has_many :application_sessions, inverse_of: :application

ApplicationsSession

class ApplicationSession < ActiveRecord::Base
  belongs_to :application, inverse_of: :application_sessions


  1. 如果有可能我想通过Application创建ApplicationSession,但application_session.build_application将无效,因为它永远不会是有效记录。

  2. application_session.create_application无法正常工作,因为即使ApplicationSession不是有效记录,也会创建Application

  3. 第一个;它会验证ApplicationApplicationSession。如果application_id只有ApplicationSession是有效记录,我才会跳过Application验证,这个逻辑可能会正常工作。如果有的话,我仍然更喜欢使用更优雅的解决方案。

    第二个;如果Application不是有效记录,我可以删除ApplicationSession,但我不太喜欢这个解决方案。


    创建/不与Rails一起创建这些依赖记录的最佳方法是什么?



    澄清:

    简单地说,我希望父母和孩子一起创建,同时没有父母和一个有效的孩子即将保存(有效期望它没有任何父母)。如果孩子不是有效记录,则不应创建任何内容。

2 个答案:

答案 0 :(得分:1)

我认为使用new和build会起作用。

application = Application.new({attr1: val1, attr2: val2 ..})
application.application_sessions.build({attr1: val1, attr2: val2 ..})
application.save

这样,如果应用程序无效,则不会保存应用程序及其新的application_session。如果application_session无效,也是如此。

在您启动rails console命令的终端中,您会看到如下内容:

(0.1ms)  begin transaction
(0.1ms)  rollback transaction

如果应用程序及其新的application_session都有效,则两者都将被保存:)

答案 1 :(得分:0)

从数据建模的角度来看,我不确定你要做什么。

我认为您有父/子关系,父母是可选的?

如果您创建一个父项然后删除它,您将在该子项中使用悬空键,这些键指向任何内容,在那里只有空值要好得多。

有什么理由你不能只调用new或使用null父ID创建?父键是强制性的吗?如果是这样,请关闭强制性要求,它应该有效。构建仅在父对子之间起作用,而在所有键都为空时不起作用。我认为您必须在父级上调用save,并且一旦知道父ID就保存子级。

如果父项必须存在,您的应用才能工作,创建一个虚拟的并且让所有孩子都不想拥有属于它的特定父级,那么您可以轻松地再次找到它们。在不知道你的应用程序的流程的情况下,我不确定我还能提出什么建议。

相关问题