使用 Object.const_get().new 创建对象时未调用 rails before_create

rails before_create not called when creating an object with Object.const_get().new

我有一个 table 继承机制和一个基于文本类型创建对象的控制器方法。

来自我的控制器:

tile = Object.const_get(tile_data[:type]).new(params_from_tile(tile_data))

tile.save

在我的模型库中 class 我有几个 before create hooks:

before_create :set_handle, :upload

看来我的 none 个钩子正在触发,这与我使用 Object.const_get 创建对象有关吗?

编辑:我已经设法通过不使用 Object.const_get() 来解决这个问题。现在我只是直接调用我的 Tile.new,而且似乎没有任何负面影响反响,所以是的。

我已将其更改为直接调用基类:

Tile.new(params_from_tile(tile_data))

现在我的钩子按预期被调用,所以我不确定为什么会这样,希望知道的人能提供更好的答案,但答案似乎是使用 Object.const_get().new 来创建对象会跳过所有挂钩。附带说明一下,仅使用类型属性在基类上调用 create 仍会触发子类挂钩,这很好。

理论上,访问 class 的方式没有区别,两者的行为完全相同:

Tile.new(params_from_tile(tile_data))

Object.const_get("Tile").new(params_from_tile(tile_data))

你看到不良行为可能与其他一些小东西遗漏有关。

可能 tile_data[:type] 在您的示例中指向其他内容,您是否确保 Tile 记录在没有 callback 的情况下保存。你能试试 Object.const_get("Tile") 看看会发生什么吗?