ruby-on-rails - 关联的级联更新
问题描述
我有一个班级Yojana
和另一个班级Kabuliyat
,其中 Kabuliyat 属于 Yojana,而一个 Yojana 有一个 kabuliyat。
class Yojana < ApplicationRecord
has_one :kabuliyat, dependent: :destroy
end
class Kabuliyat < ApplicationRecord
belongs_to :yojana
end
kabuliat 实例的某些字段/属性取决于yojana 实例的属性。
例如新的 kabuliyat的部分形式。
- @yojana = Yojana.find_by_id(params[:yojana_id])
= form_for kabuliyat do |f|
tr
td = f.label :yojana_name
td = f.text_field :yojana_name, {value: @yojana.yojana_name,class: "hide-input",:readonly => true}
tr
td = f.label :mukhya_samiti
td = f.text_field :mukhya_samiti, {value: @yojana.mukhya_samiti,class: "hide-input",:readonly => true}
如您所见, kabuliyat 实例的:yojana_name和:mukhya_samitit等属性是从其父 yojana 实例属性中提取的。
问题:
我想知道,如果我保存了 kabuliyat 的实例,然后我编辑了 Kabuliyat 的属性所依赖的 Yojana 的实例,我将如何能够反映 kabuliyat 的实例上的更改。
例如:如果我将 Yojana 实例的名称从“A”更改为“B”,这种更改是否会自动反映在子实例 kabuliyat 的属性上(例如:yojana_name)。
我试过的:
我在Yojana.rbbefore_update
模型类中使用了回调,并手动更改了 Yojana 上所有其他依赖的类。我想知道是否还有其他有效的方法。
解决方案
创建一个服务,UpdateYojana
你可以这样做,
class UpdateYojana
attr_reader :yojana, :kabuliyat
def initialize(yojana)
@yojana = yojana
@kabuliyat = yojana.kabuliyat
end
def self.update(yojana_id, params)
yojana = Yojana.find(yojana_id)
new(yojana).update(params)
end
def update(params)
return false unless valid?
ApplicationRecord.transaction do
if yojana.yojana_name_changed? or yojana.mukhya_samiti_changed?
kabuliyat.update!(yojana_name: yojana.yojana_name, mukhya_samiti: yojana.mukhya_samiti)
end
yojana.save!
end
end
private
def valid?(params)
params.each do |attr, value|
yojana.public_send("#{attr}=", value)
end
yojana.valid?
end
end
当然,您可以对代码进行很多改进,但这只是为了让您了解如何解决此问题。
推荐阅读
- r - 在每行中使用逗号分隔变量的子集/过滤数据框
- python - 我的机器人给了我一个语法错误,回调函数添加到 bot.get_command
- css - 如何使用“IntersectionObserver”实现垂直滚动捕捉?
- python - 当用作参数时,如何键入提示 arr.array 特定类型?
- amazon-web-services - 通过查询 DynamoDB 最大 1MB 可以获得的最佳性能是多少?
- typescript - 如何从打字稿中返回类型未知的函数提供默认值
- python - 将单个输入传递给 scikit-learn 时遇到问题
- reactjs - 如何触发 GraphQL 错误以在 Apollo 客户端上测试 ErrorLink?
- security - 如何隐藏 Visual Studio Code Extension 的 API 密钥?
- powerbi - 如何使用 DAX 将数字与文本混合?