2011-06-04 32 views
0

我在Rails 3 Activerecord中工作。我有兩個城市和貨運模型,我試圖對從一個城市(ship_from)出貨並運送到另一個(ship_to)的貨件建模。這是我有:如何建模一個城市的貨件(來源)到另一個(目的地)有效的記錄

class Shipment < ActiveRecord::Base 
    belongs_to :ship_from, :class_name => "City", :foreign_key => "city_id" 
    belongs_to :ship_to, :class_name => "City", :foreign_key => "city_id" 
end 

class City < ActiveRecord::Base 
    has_many :ship_froms 
    has_many :ship_tos 
end 

我知道我失去了一些東西很淺顯,但我只是沒有得到它。任何指導將不勝感激。謝謝。

回答

1

你建模兩個一對馬關係。你說的Shipment有一個from城市和一個to城市。

一邊是保存在您的表格中的部分。因此,您需要在出貨量表中保存from_city_idto_city_id。這兩列都包含城市的ID。

您模型通過在裝運類中添加以下代碼這個城市的關係:

belongs_to :from_city, :class_name => 'City' 

此代碼意味着我們有一個屬性from_city哪種類型City(從選項:CLASS_NAME,默認情況下會FromCity) 。您可以通過搜索id = from_city_id(id爲默認選項:primary_key,from_city_id是foreign_key的默認值)來查找城市。

對於TO_CITY聲明

belongs_to的:TO_CITY,:CLASS_NAME => '市'

關係的許多部分是在City類。說你有這個城市的許多貨物。您聲明如下:

many :from_shipments, :class_name => 'Shipment', :foreign_key => 'from_city_id' 

的代碼意味着我們有一個屬性from_shipments哪種類型的Shipment個集合(:CLASS_NAME)。您可以通過在from_city_id = id表的出貨量搜索找到裝運(我們通過聲明覆蓋缺省city_id:foreign_key)

對於TO_CITY聲明

many :to_shipments, :class_name => 'Shipment', :foreign_key => 'to_city_id' 

更多的默認值和選項belongs_to的信息,has_one,has_many可以找到here

+0

非常感謝。我認爲我在追隨,但我並不是那麼完美。在我的貨運模型中,我是否明確地創建了from_shipment和to_shipment的列,以便貨運模型/表具有:shipment_id,to_shipment,from_shipment。 – Mutuelinvestor 2011-06-04 21:21:17

+0

您的貨件表中只需要2列。 from_city_id(包含您從哪個城市運送的城市的ID)和to_city_id(包含您要運送到的城市的ID)。城市表中引用的列ID已存在。 – 2011-06-05 09:23:01

0

您需要將此「ship_from」/「ship_to」關係存儲在數據庫中才能正常工作。否則,無法從數據庫的狀態知道這一點。

假設許多一對多的關係,在這裏(因爲你不希望複製的城市信息),您將需要一個加盟模式/表,例如:

class ShipmentLocation < ActiveRecord::Base 
    # Fields: 
    # - shipment_id 
    # - city_id 
    # - location_type 
    # => this can be either "SOURCE" or "DESTINATION" 

    belongs_to :shipment 
    belongs_to :city 

    # TODO: add a validation to ensure that multiple sources/destinations are not added! 
end 

然後,在你Shipment模型,你可以有這樣的:

has_many :shipment_locations 

has_one :source, 
     :through => :shipment_locations, 
     :source => :city, 
     :conditions => { :location_type => "SOURCE" } 

注意:這不是完全測試,左邊是休息作爲一個練習OP :)

相關問題