Ruby on rails RubyonRails-在创建子项时更新父字段

Ruby on rails RubyonRails-在创建子项时更新父字段,ruby-on-rails,activerecord,ruby-on-rails-4,Ruby On Rails,Activerecord,Ruby On Rails 4,我有两个模型,Submission(父对象)和SubmissionDetail(子对象)提交有一个名为状态的字段,该字段可以是不完整、待定、已批准或未批准。创建新的提交时,状态自动设置为未完成。孩子的外键为:submission\u id 我希望在创建新的SubmissionDetail时,其父级的状态将自动更改为“挂起”。不确定如何执行此操作。例如,我在模型中读了一些关于touch,但我认为这不适用于这里。touch只是将更新的_at列更新为当前时间。您只需在创建挂钩后添加一个挂钩: clas

我有两个模型,
Submission
(父对象)和
SubmissionDetail
(子对象)<代码>提交有一个名为
状态
的字段,该字段可以是不完整、待定、已批准或未批准。创建新的
提交
时,
状态
自动设置为未完成。孩子的外键为
:submission\u id


我希望在创建新的
SubmissionDetail
时,其父级的状态将自动更改为“挂起”。不确定如何执行此操作。例如,我在模型中读了一些关于
touch
,但我认为这不适用于这里。

touch只是将更新的_at列更新为当前时间。您只需在创建挂钩后添加一个挂钩:

class SubmissionDetail < AR

  belongs_to :submission
  after_create :set_pending

  private

  def set_pending
    submission.update_attributes(state: "Pending") # or whatever random method
  end

end
class SubmissionDetail
每当创建新的子项时,您可能可以利用更新父项

class Submission < ActiveRecord::Base
  has_many :submission_details
end

class SubmissionDetail < ActiveRecord::Base
  belongs_to :submission

  after_create :set_parent_to_pending

  def set_parent_to_pending
    # child should always have a parent, but we need to check just in case
    submission.update(status: 'pending') unless submission.nil?
  end
end
类提交

创建子记录后,将运行
after_create
回调

您当然可以通过挂接
创建
来处理此问题,但是您没有挂接
更新
,某些操作不会传播回
提交
。您还将业务逻辑和耦合模型散落在持久性层中

class Submission < ActiveRecord::Base
  has_many :submission_details
end

class SubmissionDetail < ActiveRecord::Base
  belongs_to :submission

  after_create :set_parent_to_pending

  def set_parent_to_pending
    # child should always have a parent, but we need to check just in case
    submission.update(status: 'pending') unless submission.nil?
  end
end
避免创建服务对象,我的首选是使用:

class SubmissionDetail
这使得
SubmissionDetail
中的逻辑不存在,并使
Submission
负责保持其自身状态最新


请注意,如果您最终不得不根据流和类似的条件来操纵状态,那么您真的需要考虑集成一个状态机。

我喜欢让
提交对自己的状态负责的想法,但如前所述,每次更改
SubmissionDetail
时(不仅仅是在创建时),都会将
Submission
状态设置为
pending
,这可能不是所需的行为。如果父级
提交的状态取决于
SubmissionDetail
的某些属性,
touch
回调无法访问最初触发它的记录(即
SubmissionDetail
)@carlosramireziii True,该怎么办。这里没有考虑到很多优势,这就是为什么我通常更喜欢编写更多面向对象的代码来处理业务逻辑,并让我的持久性层专注于持久性。Rails模型按原样做得足够了。从来都不知道创建后会发生什么!非常感谢,这在我的项目中起了作用。我一定会保存你提供的链接。