【问题标题】:Specifying Inheritance Class Type In Rails Form在 Rails 表单中指定继承类类型
【发布时间】:2009-10-21 02:10:29
【问题描述】:

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

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

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

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

    所以。

    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. 
    

    虽然每个表单有单独的类型可能会有点困难,更新它们应该给出正确的类型,但否则你可能会在分隔字段时遇到问题(所有都必须是 Car,这会发生冲突)。

    但对子类执行上述操作也不是问题。 你甚至可以通过 Truck.find(params['id']).becomes(Car) 来保证安全,但是,如果你有单独的卡车逻辑,你就会失去它。

    更新:

    回应评论:

    是的,这是因为 type 是一个受保护的属性,这意味着您不能通过new()update_attributes()build() 或任何其他允许您一次为多个属性分配值的方法来分配它.

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

    【讨论】:

    • 嘿吉米,现在我在表单中分配类型,问题是控制器抛出错误“警告:无法批量分配这些受保护的属性:类型”并且类型没有t 实际上存储在数据库中。知道如何解决这个问题吗?
    猜你喜欢
    • 2012-07-21
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多