2011-03-01 93 views
4

我正在使用Rails似乎並不擅長的數據概念 - 路由有兩個(也是唯一的兩個)機場。我終於想出瞭如何對我的外鍵進行硬編碼,使它們變得明智。Rails 3:多個has_one關聯和播種

models/route.rb很簡單:

class Route < ActiveRecord::Base 
    has_one :airport, :foreign_key => 'from_airport_id', :class_name => 'Airport' 
    has_one :airport, :foreign_key => 'to_airport_id', :class_name => 'Airport' 
end 

這一切似乎是工作的罰款,但我似乎無法得到它正確地播種。

seeds.rb看起來像這樣:

Airport.delete_all 
@kpdx = Airport.create(:icao => 'KPDX', :name => 'Portland International Airport', :lat => '45.58869934', :lon => '-122.5979996') 
@ksea = Airport.create(:icao => 'KSEA', :name => 'Seattle Tacoma International Airport', :lat => '47.4490013122559', :lon => '-122.30899810791') 
Route.delete_all 
Route.create(:from_airport_id => @kpdx, :to_airport_id => @ksea, :route => "RIVR6 BTG OLM6") 
Route.create(:from_airport_id => @kpdx, :to_airport_id => @ksea, :route => "BTG OLM OLM6") 

Route.create(:from_airport_id => Airport.find_by_icao("KSEA"), :to_airport_id => Airport.find_by_icao("KPDX"), :route => "SEATL4 SEA HELNS4") 
Route.create(:from_airport_id => Airport.find_by_icao("KSEA"), :to_airport_id => Airport.find_by_icao("KPDX"), :route => "SEA HELNS4") 

注意,我試圖告訴種子數據從我創建到其他機場的一個走兩種不同的方式。兩者都不起作用。當我運行rake db:seed時,from_airport_idto_airport_id字段的所有字段都設置爲1,此時airport表中的ID正在遞增(在我當前運行中爲23 &)。

所以我有兩個問題:

  1. 有沒有更好的方式來處理比我在做什麼型號代碼?
  2. 我是什麼在播種:-)

感謝做錯了!

回答

9

我會改變你的模型,以指定爲每個關係的不同的符號:

class Route < ActiveRecord::Base 
    has_one :from_airport, :foreign_key => 'from_airport_id', :class_name => 'Airport' 
    has_one :to_airport, :foreign_key => 'to_airport_id', :class_name => 'Airport' 
end 

由於啓用has_one,您可以通過名稱(例如route.airport)訪問的關係,這些都需要是不同的。

爲了讓您的播種工作,在機場打電話.id

Route.create(:from_airport_id => @kpdx.id, :to_airport_id => @ksea.id, :route => "RIVR6 BTG OLM6") 

例子:

ruby-1.9.2-p136 :001 > a = Airport.create(:icao => 'KPDX', :name => 'Portland International Airport') 
=> #<Airport id: 1, icao: "KPDX", name: "Portland International Airport", created_at: "2011-03-01 02:44:42", updated_at: "2011-03-01 02:44:42"> 
ruby-1.9.2-p136 :002 > b = Airport.create(:icao => 'ABCD', :name => 'Another Airport') 
=> #<Airport id: 2, icao: "ABCD", name: "Another Airport", created_at: "2011-03-01 02:46:22", updated_at: "2011-03-01 02:46:22"> 
ruby-1.9.2-p136 :003 > r = Route.create(:to_airport_id => a.id, :from_airport_id => b.id) 
=> #<Route id: 3, from_airport_id: 2, to_airport_id: 1, route: nil, created_at: "2011-03-01 02:46:36", updated_at: "2011-03-01 02:46:36"> 
+0

好了,好消息!我做了這個改變。播種問題仍然看起來一樣(請注意,我沒有更改seeds.rb中的任何內容,所以如果我應該這樣做,我錯過了它:-) – tkrajcar 2011-03-01 01:19:48

+0

回答更新代碼來修復種子。 – 2011-03-01 02:49:59

+0

太棒了,修正了它。謝謝! – tkrajcar 2011-03-01 04:54:34