Rails 3: Несколько ассоциаций has_one и раздача

Я работаю с концепцией данных, с которой Rails, похоже, не очень хорошо справляется - у Route есть два (и только два) аэропорта. Наконец-то я понял, как жестко запрограммировать внешние ключи, чтобы они были разумными.

Мой 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_id и to_airport_id просто устанавливаются в 1, когда идентификаторы в таблице airport увеличиваются (23 и 24 в моем текущем запуске).

Итак, у меня есть два вопроса:

  1. Есть ли лучший способ обработки кода модели, чем то, что я делаю?
  2. Что я делаю не так в раздаче :-)

Спасибо!


person tkrajcar    schedule 01.03.2011    source источник


Ответы (1)


Я бы изменил вашу модель, чтобы указать другой символ для каждого отношения:

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">
person Michelle Tilley    schedule 01.03.2011
comment
Хорошо, приятно знать! Я сделал это изменение. Проблема с раздачей по-прежнему выглядит так же (обратите внимание, что я ничего не менял в seed.rb, поэтому, если я должен был это сделать, я пропустил это :-) - person tkrajcar; 01.03.2011
comment
Отлично, это исправило. Спасибо! - person tkrajcar; 01.03.2011
comment
Примечание для тех, кто идет по этому пути. Позже у меня возникли некоторые проблемы, и мне пришлось переключиться на belongs_to вместо has_one в route.rb. После этого все отлично. - person tkrajcar; 13.08.2011