2009-10-23 53 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