Ruby on rails 如何在Rails中以相同的形式访问和提交相关的多态模型?
假设我有3个模型,Ruby on rails 如何在Rails中以相同的形式访问和提交相关的多态模型?,ruby-on-rails,forms,associations,polymorphism,Ruby On Rails,Forms,Associations,Polymorphism,假设我有3个模型,汽车,摩托车和卡车,对于每一个模型,我都必须输入一系列信息,例如已知的前车主列表、交通罚单、车牌等。因此我为每个模型创建了一个模型(前车主,前车牌,等等)并为相关模型建立多态关联 问题是,我如何只使用一个表单输入所有这些内容,类似这样: Car #123 Known previous owners: Jason Jazz Brian Bass [add another] Known previous license plates: 12345 67890 [add anot
汽车
,摩托车
和卡车
,对于每一个模型,我都必须输入一系列信息,例如已知的前车主列表、交通罚单、车牌等。因此我为每个模型创建了一个模型(前车主
,前车牌
,等等)并为相关模型建立多态关联
问题是,我如何只使用一个表单输入所有这些内容,类似这样:
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
模型,并将“Car”等作为类别,但这只是为了说明在我的例子中对多态模型的真正需要。)
谢谢。很好,嵌套表单生成器不必与嵌套资源关联。您也可以发布模型代码吗?有一种方法可以帮助您从多个模型构建单个表单 如果汽车/摩托车/卡车型号相同,则应在车型中添加“类型”列。如果不是,您应该使用STI(单表继承)
但是,是的,我需要先查看您的模型,然后才能给您代码。也许PresenterPattern也很有用: 其基本思想是创建一个演示者,该演示者的行为类似于模型,处理来自表单的所有传入数据并将其分发给模型。通过这种方式,也很容易创建多个lets实例,比如PreviousOwner,并将其附加到汽车上
查看链接 您可以在Rails 2.3中使用新的嵌套属性,但是您必须以某种方式编写它才能使其正常工作。诀窍在于,您需要创建实际的多态对象,然后构建包含“属于多态”子句的类。这是我发现的一个例子,由一个名为:Superslau的用户发布(我在这里已经清理了很多): 这个功能真是太棒了。我有 用多态性实现了这一点 协会,它的工作 不要 担心如果这没有任何意义, 我只是想让人们知道这一点 接受工程的\u嵌套\u属性\u 多形性很好 协会。谢谢你,伊洛伊
您可以通过引入车型来避免这种情况,并使事情变得更简单。车辆模型可以拥有您所有的旧车主、旧车牌等集合,然后您的卡车、汽车和摩托车模型可以拥有一辆车。Rails“new”接受“stuff”的嵌套属性,这不是过时了吗?它可以一种方式工作,但不能另一种方式工作。你的情况根本没有什么不同,因为上传知道它只有任务要处理。换一种方式尝试是不可能的,因为“属于”关系是多态的,从逻辑上讲,rails不知道如何确定要创建什么。我也有点喜欢这个。
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
def new
@upload = Upload.new
@upload.task = Task.new
@upload.task.assets.build
end