具有嵌套属性创建的模型更改了before_validation和before_save之间的关联类型属性

爱德华

我有一个模型,Guest其中包含的嵌套属性Numberplate

Guest采用STI(单表继承)并从继承Person为避免需要额外的查询或加入另一个表,我将人员类型保存person_typeNumberplate表中称为字段的地方这样,我就知道哪些号码牌归来宾所有,而无需与人员表一起加入。

由于此设置,我需要在上手动设置正确person_type的名称Numberplate(存在其他人类型)。我将其实现为模型before_validation上的回调Numberplate

before_validation do
    self.person_type = self.person.type
end

实际的实现更为通用,但归结为这一点。现在,我将在控制台中创建一个GuestNumberplate在一个调用中,所有这些都将按预期工作:

Numberplate.new({person: Guest.new({company: Company.first}), plate: 'EFEF98'})

person_typeNumberplate实例正确设置"Guest"

当我有一个允许嵌套属性在一个请求中创建Guest的API端点时,就会出现问题Numberplate奇怪的是,person_type获取的内容"Person'"Guest"预期的一样,而不是预期的。我调试了一下,并person_typebefore_validation回调中正确设置gets,但是在该回调和before_save回调之间,person_type突然更改为"Person"我尝试覆盖person_type设置器并设置时记录日志。奇怪的是,没有在两个ActiveRecord回调之间调用设置器。

对于这种行为的引入方式,以及这是否是某个地方的Rails核心中的错误,还是我没有考虑到什么,我感到有些困惑。我当前的解决方法是person_type在另一个before_save回调中设置,但这并不是最佳解决方案。

相关型号:

class Guest < Person
    accepts_nested_attributes_for :numberplates
end

class Numberplate < ApplicationRecord
    before_validation do
        self.person_type = self.person.type
    end

    after_validation do
        # person_type is correctly set to "Guest"
        puts self.inspect
    end

    before_create do
        # person_type is now suddenly set to "Person"
        puts self.inspect
    end
end
爱德华

所以我想通了。

Person课堂上我有这个:

has_many :numberplates, as: :person, inverse_of: :person

as: :person部分不应存在,并介绍了此行为。它之所以存在是由于较早地从多态性迁移到STI,因此被遗忘了。一旦我删除了所有内容,一切按预期进行。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在相关模型中的属性更改后运行before_save

来自分类Dev

在相关模型中更改属性后运行before_save

来自分类Dev

rails 模型回调 before_validation

来自分类Dev

在Rails before_save方法中大写多个属性

来自分类Dev

编写before_save函数以检查所有目标属性的更好方法不是空白吗?

来自分类Dev

跳过before_validation:在测试中创建

来自分类Dev

before_validation没有被调用?

来自分类Dev

模型before_save中的变量范围

来自分类Dev

多次创建 before_save 调用

来自分类Dev

检测新创建的模型是否更改了属性

来自分类Dev

回形针,before_save和删除附件

来自分类Dev

在::create或在::save上的rails 4 before_validation

来自分类Dev

使用实时实体的before_save和after_save之间的区别

来自分类Dev

如何为具有嵌套属性的多态模型保存一个longate_to关联?

来自分类Dev

具有选定属性的递归嵌套类型

来自分类Dev

具有多态关联和可接受的嵌套属性的factorygirl验证失败

来自分类Dev

如何验证在before_save中更改的数据

来自分类Dev

具有模型和列表属性的RedirectToAction

来自分类Dev

Rails:before_save大写私有方法

来自分类Dev

before_validation方法不起作用

来自分类Dev

ASP.Net Core,创建具有复杂数据类型属性的模型

来自分类Dev

创建具有多个表作为属性类型的属性

来自分类Dev

Rails 3 Form Helper用于具有嵌套属性的模型

来自分类Dev

为具有admin属性的用户设计定义路线和before_filter

来自分类Dev

Rails:`before_save`会干扰`save?`

来自分类Dev

具有自己的属性和关联对象ID的Rails ActiveRecords

来自分类Dev

基本 Java MVC:Beans 和具有属性的关联实体

来自分类Dev

如果元素具有ID属性,则覆盖伪元素:: before

来自分类Dev

是否可以提供具有通用类型作为属性的模型?

Related 相关文章

  1. 1

    在相关模型中的属性更改后运行before_save

  2. 2

    在相关模型中更改属性后运行before_save

  3. 3

    rails 模型回调 before_validation

  4. 4

    在Rails before_save方法中大写多个属性

  5. 5

    编写before_save函数以检查所有目标属性的更好方法不是空白吗?

  6. 6

    跳过before_validation:在测试中创建

  7. 7

    before_validation没有被调用?

  8. 8

    模型before_save中的变量范围

  9. 9

    多次创建 before_save 调用

  10. 10

    检测新创建的模型是否更改了属性

  11. 11

    回形针,before_save和删除附件

  12. 12

    在::create或在::save上的rails 4 before_validation

  13. 13

    使用实时实体的before_save和after_save之间的区别

  14. 14

    如何为具有嵌套属性的多态模型保存一个longate_to关联?

  15. 15

    具有选定属性的递归嵌套类型

  16. 16

    具有多态关联和可接受的嵌套属性的factorygirl验证失败

  17. 17

    如何验证在before_save中更改的数据

  18. 18

    具有模型和列表属性的RedirectToAction

  19. 19

    Rails:before_save大写私有方法

  20. 20

    before_validation方法不起作用

  21. 21

    ASP.Net Core,创建具有复杂数据类型属性的模型

  22. 22

    创建具有多个表作为属性类型的属性

  23. 23

    Rails 3 Form Helper用于具有嵌套属性的模型

  24. 24

    为具有admin属性的用户设计定义路线和before_filter

  25. 25

    Rails:`before_save`会干扰`save?`

  26. 26

    具有自己的属性和关联对象ID的Rails ActiveRecords

  27. 27

    基本 Java MVC:Beans 和具有属性的关联实体

  28. 28

    如果元素具有ID属性,则覆盖伪元素:: before

  29. 29

    是否可以提供具有通用类型作为属性的模型?

热门标签

归档