2009-10-23 43 views
0

嘿家伙。我对铁轨的发展很陌生,并且遇到了一些困难。我正在处理的应用程序是一个调度解决方案,需要更新联接模型,但不是以简单的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艺术的神奇,这就是我想要的应用程序看起来像:

我已经删除我本来不完整的视图代码:

/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) 

EDIT(09NOV04)张贴,但想更新一下这个问题。

我认为这里的一部分困惑(对于我自己和可能对任何可能帮助的人)是因为我没有正确解释关系。

  1. 标记有许多来港定居人士
  2. 时间表有很多标记
  3. 路线有很多的时间表

这是基础。

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

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

我不知道如果清除它收拾:当你创建一个路由P

回答

1

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

就时间表而言,没有任何关联标记与路线。您按照任何时间安排的方式可以为数据库中定义的每个标记添加任意数量的到达条目。

您需要进行一些更改才能获得所需的功能。我假设一个时间表属于一条路线。为了节约空间,我还排除了线路的accept_nested_attributes_。

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负责创建/删除连接表中的条目。

对不起,但不知道更多,我不会推测视图的样子。

+0

现在我有了route_markers,我可以通过执行@ schedule.route_markers.find(:all)来获取控制器中的标记,并使用它在视图中构建列表。 这就是我想要做的事情,这让我感到有点不舒服。我正在使用标记列表来构建一个简单的表格。每个“行”应该代表特定标记的到达条目的数量。我正在使用“复杂形式”示例来设置“列”的动态添加,但我不确定如何将该部分设置为输入和编辑。如果有帮助,我在原始文章中有一个“理想”视图配置。 – 2009-10-25 20:44:27

+0

我不明白你的专栏应该代表什么。每个专栏应该是一个到达?因为现在已经布置了一些方法,所以没有办法将多个到达标记联系起来。你能否更新你的问题以更好地解释表单? – EmFi 2009-10-25 21:01:37

+0

嘿Emfi, 我想要做的是这样的:每个标记可以有多个到达。我想要做的是能够根据可用标记的数量添加到达的新“列”。我认为这是它变得混乱的地方。您应该无法一次添加“单个”到达条目,但从技术上讲,这是它将存储在数据库中的方式。 用例如下:如果您有标记称为Point1,Point2 ... Pointn,那么当您单击“Add”时,它应该为每个标记生成字段,并且每个字段表示一个到达。 – 2009-11-04 16:02:08