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

时间:2017-08-02 17:39:59

标签: ruby-on-rails single-table-inheritance

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

来自我的控制器:

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

tile.save

在我的模型基类中我在创建钩子之前有几个:

before_create :set_handle, :upload

看来我的钩子都没有射击,它是否与我使用Object.const_get创建我的对象有关?

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

2 个答案:

答案 0 :(得分:1)

理论上,你访问这个类的方式没有区别,这两个行为完全相同:

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"),看看会发生什么。

答案 1 :(得分:0)

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

Tile.new(params_from_tile(tile_data))

现在我的钩子被按预期调用了,所以我不确定为什么这样做会这样,并且会欣赏知道的人的更好答案,但似乎答案是使用Object.const_get ().new创建一个对象跳过所有钩子。在旁注中,仅使用type属性在基类上调用create仍然会导致子类挂钩触发,所以这很好。