更新二维表单

时间:2009-10-23 18:06:29

标签: ruby-on-rails forms associations

嘿伙计们。我是铁轨开发的新手,并且已经打了一针墙。我正在研究的应用程序是一个需要更新连接模型的调度解决方案,但不是简单的1:1方式。

该应用程序的布局如下:

class Route < ActiveRecord::Base
  has_many :markers, :foreign_key => 'source_id'  
  has_many :schedules

  accepts_nested_attributes_for :markers, :allow_destroy => true, :reject_if => proc { |a| a['name'].blank? }
  accepts_nested_attributes_for :schedules, :allow_destroy => true, :reject_if => proc { |a| a['name'].blank? }
end

class Schedule < ActiveRecord::Base  
  has_many :arrivals
  has_many :markers, :through => :arrivals

  accepts_nested_attributes_for :arrivals, :allow_destroy => true, :reject_if => :all_blank
end

class Marker < ActiveRecord::Base  
  has_many :arrivals
  has_many :schedules, :through => :arrivals
end

class Arrival < ActiveRecord::Base
  belongs_to :marker
  belongs_to :schedule
end

...所以一个基本的has_many:通过...或者我认为:P

创建路线时,您可以创建1..n计划和1..n标记。编辑计划应该允许您为路线中定义的每个标记添加1..n到达条目。这就是让我悲伤的原因。

通过ascii-art的魔力,这就是我希望应用程序看起来像:

/views/routes/edit.html.erb (works already)

ROUTE
-----
...

SCHEDULES
---------
[Add]

* Schedule 1 [Edit][Delete]
* Schedule 2 [Edit][Delete]
...

MARKERS
-------
[Add]

* Marker 1 [Edit][Delete]
* Marker 2 [Edit][Delete]
* Marker 3 [Edit][Delete]
* Marker 4 [Edit][Delete]
...

/views/schedules/edit.html.erb

SCHEDULE X
----------
[Add Col.]

Marker 1 [ ] [ ]
Marker 2 [ ] [ ]
Marker 3 [ ] [ ]
Marker 4 [ ] [ ]
         [x] [x]

(the [x] should remove a column)

编辑(09NOV04):

我删除了原先发布的不完整的视图代码,但想稍微更新一下这个问题。

我认为这里的一些混乱(对我自己,可能对任何可能提供帮助的人而言)是我没有正确解释这些关系。

  1. 标记有很多到达
  2. 时间表有许多标记
  3. 路线有很多时间表
  4. 这是基础。

    拥有一个可以更新单个标记到达的表单并不困难,因为这是一个基本形式。我希望做的是提供一个同时更新所有标记的表单。

    当您点击“添加条目”时,它应该为当前可用的每个标记添加新的。在每个“列”下,应该有一个“删除”按钮,它将删除该特定列的每个到达(因此从每个标记)。

    我不确定是否会将其清除:P

1 个答案:

答案 0 :(得分:1)

  

创建路线时,您可以   创建1..n计划,以及1..n   标记。编辑时间表应该   允许您添加1..n到达条目   对于路线中定义的每个标记。   这就是让我悲伤的原因。

就日程安排而言,没有任何标记与路线相关联。您放置任何计划的方式可以为数据库中定义的每个标记添加任意数量的到达条目。

您需要进行一些更改才能获得所需的功能。我假设一个时间表属于一条路线。我也省略了accepts_nested_attributes_for行,以节省空间。

class Route < ActiveRecord::Base
  has_many :markers, :foreign_key => 'source_id'  
  has_many :schedules
  ...
end

class Schedule < ActiveRecord::Base  
  has_many :arrivals
  belongs_to :route
  has_many :markers, :through => :arrivals
  has_many :route_markers, :through => :route, :source => :markers
  ...
end

class Marker < ActiveRecord::Base  
  has_many :arrivals
  has_many :schedules, :through => :arrivals
  ...
end

class Arrival < ActiveRecord::Base
  belongs_to :marker
  belongs_to :schedule
  ...
end

现在@schedule.route_markers返回链接到计划的路线中的标记列表。 您可以使用它们来生成网格。然后创建到达对象以在特定计划中建立标记。

然后它只是@schedule.markers= list_of_markers的问题,rails负责在连接表中创建/删除条目。

很抱歉,但不知道更多,我不会推测视图会是什么样的。