复杂?从Rails中的其他模型构建模型

时间:2011-08-19 09:07:12

标签: ruby-on-rails nested-forms

我为rails应用程序中的许多资源创建了脚手架,这些脚本构成了系统的内容。

我现在需要做的是构建一个表单,让新用户从脚手架中选择元素,然后保存。实际上,它是其他资源的配置。

例如,

我有四种模式:

class House < ActiveRecord::Base
   has_many :windows 
   has_many :doors
end

class Window < ActiveRecord::Base
   belongs_to :house
   has_many :locks
end

class Door < ActiveRecord::Base
   belongs_to :house
   has_many :locks
end

class Lock < ActiveRecord::Base
   belongs_to :window
   belongs_to :door
end

管理员已将所有可用的Windows,门和锁上传到系统中 我需要建造一个有这些选择的新房子。

我希望有一种简单的方法可以做到这一点,但遗憾的是我无法想到一种干净的方式。

2 个答案:

答案 0 :(得分:1)

你的意思是你只想把一个'房子'保存在某些组合或窗户,门和通过它们锁定的地方吗?

如果这是正确的,并且如果一个房子可以有多个窗口可以在许多房屋中放置一个窗口,则应考虑将数据模型从has_many更改为{{1关系。

这样,您可以创建多个房屋,每个房屋:1)具有窗户的组合,2)具有门的组合,以及3)具有锁的组合。


如果您担心如何创建实际表单,请查看has_and_belongs_to_many

https://github.com/ryanb/nested_form

http://blog.madebydna.com/all/code/2010/10/07/dynamic-nested-froms-with-the-nested-form-gem.html

答案 1 :(得分:0)

您发现这种困难的原因是因为您的关系不太正确。 以房间为例。 您正在使用房间作为查找权吗? 因此,您需要一个外部参照表作为房屋和房间之间的多对多连接。 您可以将其称为house_room。然后,您可以为房间中每个房间和房屋之间的房间创建新的house_room记录。 您的交叉参考表在房间的情况下,需要有房屋和房间表的外键。 然后你可以在house_room中添加任意数量的窗口,但这又需要一个可以有很多锁的room_window外部参照表。

实际上我认为你会发现锁对你有用的多态关系。您不需要外部参照表。锁的多态关系允许您将锁链接到不同的模型。

不要试图使用has_and_belongs_to

使用has_many和has_many:通过关系。

您将找到有助于构建表单的fields_for和accepts_nested_attributes组合,以及用于为添加的每个新外部参照记录选择窗口,锁定等等的视图助手选择功能。

这应该给你足够的思考,并希望指出你正确的方向,至少开始思考你需要了解更多的东西。