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模型按原样做得足够了。从来都不知道创建后会发生什么!非常感谢,这在我的项目中起了作用。我一定会保存你提供的链接。