3

假设我有 3 个模型,CarMotorcycleTruck并且对于每个模型,我必须输入一堆东西,例如已知以前所有者的列表、交通罚单、车牌等。所以我为每个模型创建了一个模型(PreviousOwnersPreviousPlates等)并为相关模型建立多态关联。

问题是,我怎样才能只使用一种形式输入所有这些,有点像这样:

Car #123

Known previous owners:
Jason Jazz
Brian Bass [add another]

Known previous license plates:
12345
67890 [add another]

Current status:
Cleared 
(this is a dropdown select menu, CurrentStatus is also a polymorphic association, but with predefined values.)

etc

这被证明是一个婊子,远远超出了我的专业水平(这里是新手)。资源不是嵌套的,我在多个模型上找到的几乎所有东西都是嵌套资源,似乎没有任何东西适用于多态关联。

(这只是一个例子,我知道理想情况下我应该有一个Vehicle带有“汽车”等类别的模型,但这只是为了说明在我的案例中对多态模型的真正需求。)

谢谢。

4

6 回答 6

2

也许 PresenterPattern 也很有帮助:

http://blog.jayfields.com/2007/03/rails-presenter-pattern.html

基本思想是创建一个演示者,它像模型一样处理来自表单的所有传入数据并将其分发给模型。这样也很容易创建多个实例,比如说 PreviousOwner 并将其附加到 Car。

检查链接!

于 2009-07-21T15:58:58.117 回答
2

您可以在 Rails 2.3 中使用新的嵌套属性,但您必须通过某种方式编写它才能使其工作。诀窍是您需要创建实际的多态对象,然后构建其中包含属于多态子句的类。这是我在 Ryans Scraps找到的一个示例,由一个名为 Superslau 的用户发布(我已经在这里清理了一些内容):

这个功能真的很棒。我已经用多态关联实现了这个,它有效!

 class Task < ActiveRecord::Base
   has_many :assets, :dependent=>:destroy
   accepts_nested_attributes_for :assets, :allow_destroy => true
   belongs_to :workable, :polymorphic => true
 end



 class Upload < ActiveRecord::Base
   has_one :task, :as => :workable, :dependent=>:destroy
   accepts_nested_attributes_for :task, :allow_destroy => true 
 end

上传是一种任务。所有任务都可以上传一个或多个资产。

我花了一段时间才弄清楚我应该使用 Upload 模型作为父模型。所以在一种形式中,我可以创建一个上传,它是相应的任务条目,以及一个文件上传。

在我的控制器中:

 def new   
  @upload = Upload.new  
  @upload.task = Task.new  
  @upload.task.assets.build 
 end 

如果这没有任何意义,请不要担心,我只是想让人们知道 accept_nested_attributes_for 与多态关联工作得很好。谢谢埃洛伊!

于 2009-07-25T21:34:50.287 回答
1

很好,嵌套表单构建器不必与嵌套资源关联AFAIK。你能发布你的模型代码吗?

于 2009-06-24T08:37:30.413 回答
1

有一个RailsCast on Complex Forms可以帮助您从多个模型构建单个表单。

于 2009-06-24T14:26:45.870 回答
1

如果汽车/摩托车/卡车型号相同,则应在您的车辆型号中添加类型列。如果不是,您应该使用 STI(单表继承)。

但是,是的,在我给你代码之前,需要先看看你的模型。

于 2009-07-19T19:27:30.830 回答
1

您可以通过引入 Vehicle 模型来避免这种情况并使事情变得更简单。Vehicle 模型可以包含您所有的 PreviousOwners、PreviousPlates 等集合,然后您的 Truck、Car 和 Motorcycle 模型可以拥有一个 Vehicle。

于 2011-09-24T12:14:06.657 回答