如何解决使用它所属模型的属性在 has_many 关联中设置模型属性的最全面方法是什么?
我有两个 ActiveModel,MultivariateExperiment
其中 has_many
MultivariateExperimentvariant
。相反,一个 MultivariantExperimentvariant
belongs_to
一个 MultivariateExperiment
。
MultivariateExperiment
有一个属性 experiment_name
。
MultivariantExperimentvariant
具有属性 name
和 weighting
。
我希望变体的 name
格式为 experiment_name_0
、experiment_name_1
等。
例如,给定以下 MultivariateExperiment:
mve = MultivariateExperiment.create({ experiment_name: 'user_signup' })
我想要一种让相关变体成为的编程方式:
mve.multivariate_experiment_variants.create({ weighting: 1 }) # expected name: "user_signup_0"
mve.multivariate_experiment_variants.create({ weighting: 1 }) # expected name: "user_signup_1"
mve.multivariate_experiment_variants.create({ weighting: 2 }) # expected name: "user_signup_2"
我最初想把它放在 after_commit
回调中,但在代码审查中被告知要避免它,因为该回调很麻烦(不知道为什么)
我查看了一些其他回调,但它们似乎都不够全面,无法涵盖可以创建关联的无数方式,例如:
# 1st approach
mve.multivariate_experiment_variants.create({ weighting: 1 })
# 2nd approach
variant = MultivariateExperimentvariant.create({ weighting: 1 })
mve << variant
mve.save
# 3rd approach
mve.multivariate_experiment_variants.build({ weighting: 1 })
mve.save
# etc. etc.
那么,鉴于创建关联的各种方法,是否有任何机制或方法可以使用其所属模型的属性成功计算 has_many
关系中模型的属性?
解决方法
在 MultivariateExperimentVariant
模型中,您可以...
after_save :set_name
private
def set_name
# Assuming you have a required belongs_to
update(name: "#{multivariate_experiment.name}_#{multivariate_experiment.multivariate_experiment_variants.length - 1}")
end
除非您指定 after_commit
条件,否则您不会想要使用 on:
after_commit :set_name,on: [:create,:update]
否则,它会在记录销毁后尝试设置名称。
旁注: 改为检查索引可能会更好...
update(name: "#{multivariate_experiment.name}_#{multivariate_experiment.multivariate_experiment_variants.index(self)}")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。