4

Railsがうまく機能していないように見えるデータの概念を使用しています。ルートには2つ(そして2つだけ)の空港があります。私はついに、外部キーが賢明になるようにハードコーディングする方法を見つけました。

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

シードデータに、作成した空港の1つから別の空港に移動するように指示する方法は2つあることに注意してください。どちらも機能しません。を実行すると、テーブル内のIDが増分しているときrake db:seedにすべてのフィールドfrom_airport_idとフィールドが1に設定されます(現在の実行では23と24)。to_airport_idairport

だから私は2つの質問があります:

  1. 私がやっていることよりもモデルコードを処理するためのより良い方法はありますか?
  2. シードで何が間違っているのですか:-)

ありがとう!

4

1 に答える 1

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">
于 2011-03-01T00:23:18.200 に答える