【问题标题】:Rails 3: Multiple has_one associations & seedingRails 3:多个 has_one 关联和播种
【发布时间】:2011-07-06 04:02:41
【问题描述】:

我正在使用 Rails 似乎不太擅长的数据概念 - 一条路线有两个(并且只有两个)机场。我终于想出了如何对我的外键进行硬编码,这样它们就可以理解了。

我的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 和24)。

所以我有两个问题:

  1. 有没有比我现在做的更好的方法来处理模型代码?
  2. 我在播种时做错了什么:-)

谢谢!

【问题讨论】:

    标签: ruby-on-rails-3 associations seed


    【解决方案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">
    

    【讨论】:

    • 好的,很高兴知道!我做了那个改变。播种问题看起来仍然一样(请注意,我没有更改种子.rb 中的任何内容,所以如果我应该这样做,我错过了 :-)
    • 太好了,解决了。谢谢!
    • 注意其他走这条路的人。我后来遇到了一些问题,不得不在 route.rb 中切换到belongs_to 而不是has_one。这样做之后一切都很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多