Rails Single Table继承,params和PUT到基类

时间:2012-11-07 22:31:48

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

我有两个类“Person”和“Group”,它们是通过Rails Single Table Inheritance模式从基类“Entity”派生的。这种模式已经破坏了我的很多代码。

实体本身没有关系(例如has_many)但是Person和Group有其特定的关系。

继续简化我的代码的过程,对个人或组对象的任何更改都是针对/ entities /:id的PUT,触发更新操作。

输入问题:Rails使用attr_accessible和类必须建立params [:entity]对象的关系。由于我可能PUT的某些内容(如operator_attributes,特定于Group)只出现在Group而不是Entity中,因此Rails不会在params [:entity]中包含这些内容。

如何在仍然使用Entity控制器的情况下解决此问题,而无需重写Rails逻辑以构建params [:entity]?

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。我的子模型的行为不同,我最终创建了瘦控制器以配合我的瘦模型。它们各自具有不同的验证要求。我不能只创建一个通用的Entity对象,并在type期间设置PUT属性。我必须创造正确的物体。

显然,这并不像你想要的那么干,而且也不适合我。但就我而言,我仍然在管理面板中使用实体控制器/模型,这样我就可以显示条目并进行基本报告。在面向用户的一面,它们是分开的,实体受到保护。它们用于不同的上下文中,具有不同的逻辑和视图。所以对我而言,最终是为每个子类模型使用单独的控制器和视图的正确决定。

STI为我做的主要事情就是干掉我的数据库和我的模型。如果继承的模型以相同的方式运行和显示,则干燥更容易。希望这在某种程度上有所帮助。

答案 1 :(得分:0)

我最终通过禁用EntityController的wrap_parameters,并在客户端的原始PUT请求中创建根实体密钥来解决这个问题。

如果模型中存在方法“attribute_names”,它将调用它,因此我认为基本实体模型可以使用.constantize()或其他方法来确定正确的操作。

最好的解决方案是wrap_parameters以编程方式重新初始化params哈希。看起来这几乎是可能的:你可以改变wrap_parameters,但我还没弄清楚如何重新处理params。

请参阅:http://edgeapi.rubyonrails.org/classes/ActionController/ParamsWrapper.html#method-i-process_action