我有一个名为Vehicle的父类,还有几个子类:Car,Truck,SUV。我使用单表继承和id在表单中,以便能够选择TYPE(汽车,卡车,SUV),每个都有几个相关的字段,然后让rails构建相关的类型。这种做法变得更复杂b / c车辆属于舰队,两者的集合都在同一表格上更新。
有没有办法覆盖update_attributes和new函数以使用type字段并将子Vehicle构建为Fleets的一部分?
答案 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()
或任何其他允许您分配的方法进行分配一次为多个属性赋值。
如果查看我制作的代码,我会在第二行分配,这是因为这个“错误”