【问题标题】:Updating a 2-dimensional form更新二维表格
【发布时间】:2009-10-23 18:06:29
【问题描述】:

大家好。我是 Rails 开发的新手,并且遇到了一些障碍。我正在开发的应用程序是一个调度解决方案,它需要更新连接模型,但不是以简单的 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 :through ... 或者我认为 :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)

编辑(2004 年 11 月 9 日):

我已经删除了我最初发布的不完整的视图代码,但想稍微更新一下问题。

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

  1. 标记有很多到达
  2. 时间表有很多标记
  3. 路线有很多时刻表

这是基础。

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

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

我不确定这是否可以解决任何问题:P

【问题讨论】:

    标签: ruby-on-rails forms associations


    【解决方案1】:

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

    就时间表而言,没有任何东西可以将标记链接到路线。您制定任何计划的方式都可以为数据库中定义的每个标记添加任意数量的到达条目。

    您需要进行一些更改才能获得所需的功能。我假设一个时间表属于一个路线。我还省略了 accept_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 负责在连接表中创建/删除条目。

    抱歉,由于不了解更多信息,我不会推测视图会是什么样子。

    【讨论】:

    • 现在我有了 route_markers,我可以通过执行 @schedule.route_markers.find(:all) 来获取控制器中的标记,并使用它在视图中构建列表。这就是我正在尝试做的事情,这让我有点困惑。我正在使用标记列表来构建一个简单的表格。每个“行”应代表特定标记的多个到达条目。我正在使用“complex-forms”示例来设置“列”的动态添加,但我不确定如何设置该部分以进行输入和编辑。如果有帮助的话,我在原始帖子中有一个“理想”的视图配置。
    • 我不明白你的列应该代表什么。每一列都应该是到达吗?因为现在的布局方式,没有办法为一个标记关联多个到达。您能否用对表格的更好解释来更新您的问题?
    • 嘿 Emfi,我要做的是:每个标记可以有多个到达。我想做的是能够根据可用标记的数量添加一个新的到达“列”。我认为这就是它变得混乱的地方。您不应该一次添加“单个”到达条目,尽管从技术上讲,这就是它将存储在数据库中的方式。用例是这样的:如果您有名为 Point1、Point2 ... Pointn 的标记,当您单击“添加”时,它应该为每个标记生成字段,每个字段代表一个到达。
    • Emfi,我更新了描述......希望这比我之前的评论更有意义:P
    猜你喜欢
    • 2015-07-13
    • 2011-07-14
    • 2015-10-25
    • 2021-10-31
    • 2014-05-30
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多