1

更新:在考虑了更多之后,我认为这个问题包括多态性和 STI。

假设我有以下内容:

class Vehicle < ActiveRecord::Base
  belongs_to :dealership
  ...
end

class Car < Vehicle
  ...
end

class Truck < Vehicle
  ...
end

Car 和 Truck 模型具有相同的属性,但模型中的逻辑不同,因此它们都只使用 Vehicles 表。

我想制作一个通用表格,允许某人创建新的车辆记录,并选择它是“汽车”还是“卡车”。然后,此表单应在后端创建“汽车”或“卡车”记录,而不是通用的“车辆”记录。

问题: 您如何在 Rails 表单中显示此选项?具体来说,是否有列出抽象基础模型的子类型的方法,和/或是否有一种简单的方法可以将它们呈现为(例如)表单中的 Select 元素?

我希望创建一个可以制造汽车或卡车的表格,而不是只为汽车和卡车提供两种不同的表格的原因,最终我还希望这些模型嵌套在父级“经销商”中。我不仅希望能够创建新车辆并选择“汽车”或“卡车”作为选项,还希望能够拥有嵌套表单,用户可以在其中加载“经销商”并查看/编辑所有汽车以及以单一形式属于该经销商的卡车。我知道如何使用accepts_nested_attributes_for一个简单的关联Vehicle belongs_to :dealership来设置它,但我不确定如何为从 Vehicle 继承的子模型设置它。

4

3 回答 3

1

我有同样的问题。基本上,您正在尝试构建一个接受has_many基类关联的表单,但您想为任何 Decorated / Concrete 类动态创建单独的表单(添加嵌套字段)。

我使用cocoongem 解决了这个问题,它提供了向表单动态添加正确字段的方法。_form部分看起来像:

# _form.html.haml

= simple_form_for @dealership, :html => { :multipart => true } do |f|

  = f.simple_fields_for :vehicles do |vehicle|
    = render 'vehicle_fields', :f => vehicle
    = link_to_add_association 'Add a Car', f, :vehicles, :wrap_object => Proc.new { |vehicle| vehicle = Car.new }
    = link_to_add_association 'Add a Truck', f, :vehicles, :wrap_object => Proc.new { |vehicle| vehicle = Truck.new }

= f.button :submit, :disable_with => 'Please wait ...', :class => "btn btn-primary", :value => 'Save'

然后_vehicle_fields

# _vehicle_fields.html.haml

- if f.object.type == 'Car'
  = render 'car_fields', :f => f
- elsif f.object.type == 'Truck'
  = render 'truck_fields', :f => f

car_fields并且truck_fields还会提供一个link_to_remove_association链接cocoon

查看https://github.com/nathanvda/cocoon:wrap_object上的文档,或阅读我的博客文章http://www.powpark.com/blog/programming/2014/05/07/rails_nested_forms_for_single_table_inheritance_associations

于 2014-05-07T21:27:38.473 回答
0

我可能是错的,但我理解polymorphic相反。我的意思是,一个模型可以属于多个其他模型...

Car并且Truck是一种Vehicle。因此,可以说Vehicle具有yearmark属性。

您可以创建一个新的Caror Truck,并且定义了多态,您将像往常一样创建您的表单。

@car = Car.find(id)
@vehicle = @car.vehicles.build(year: "1999", mark: "Beetle") 
@vehicle.save

我希望它有帮助...

于 2012-07-22T20:12:59.977 回答
0

我不认为表单上的简单选择元素可以解决您的问题。您在这里尝试实现的目标被称为Multiple Table Inheritance,您的问题应该是您必须构建模型以便轻松反映在数据库中的方式。因为这是一个很长的讨论,所以我将向您指出这篇文章,我在其中解释了执行此操作的最佳方式。我希望我在某种程度上帮助了你:)

PS:要回答您的问题,Rails 框架中没有内置机制来做这种事情。

于 2012-07-22T20:25:02.293 回答