在Rails表单中指定继承类类型

时间:2009-10-21 02:10:30

标签: ruby-on-rails

我有一个名为Vehicle的父类,还有几个子类:Car,Truck,SUV。我使用单表继承和id在表单中,以便能够选择TYPE(汽车,卡车,SUV),每个都有几个相关的字段,然后让rails构建相关的类型。这种做法变得更复杂b / c车辆属于舰队,两者的集合都在同一表格上更新。

有没有办法覆盖update_attributes和new函数以使用type字段并将子Vehicle构建为Fleets的一部分?

1 个答案:

答案 0 :(得分:0)

我认为覆盖这些不是一个好主意,但请记住,这些类(在数据库视图中)唯一不同的是类型字段。

所以

car = Car.new params['Car']
car.type = params['Car']['type'] # Here you should check for valid types though
car.save

car.reload # This might work, 
           # or you have to re-fetch it completely to actually 
           # change the class of the instance. 

每个表单具有单独的类型可能会使它更难一些,但更新它们应该给出正确的类型,否则你可能会在分隔字段时遇到问题(All将必须是Car,它将发生碰撞)。 / p>

但是对于子类来说也不是一个问题。 您甚至可以通过执行Truck.find(params['id']).becomes(Car)来安全地玩它,但是,如果您有卡车的单独逻辑,那么您将放松它。

<强>更新

回应评论:

是的,这是因为type是受保护的属性,这意味着您无法通过new()update_attributes()build()或任何其他允许您分配的方法进行分配一次为多个属性赋值。

如果查看我制作的代码,我会在第二行分配,这是因为这个“错误”