2013-02-23 48 views
0

我已經安裝了下面的模型與特定的父母和孩子鍵:紅寶石DataMapper的一對許多協會將不保存使用:parent_key

 province = Province.get('BC') 
     municipality = province.municipalities.new(
      name: '100 mile house', 
      lat: 51.23131, 
      long: 121.65489, 
      current_population: 0) 

class Province 
    include DataMapper::Resource 

    property :name_short, String, key: true, length: 2, unique: true 
    property :name_long, String, length: 1..50 

    has n, :municipalities, 'Municipality', 
    parent_key: [:name_short], 
    child_key: [:province] 
end 

class Municipality 
    include DataMapper::Resource 

    property :province,   String, key: true, length: 2 
    property :name,    String, key: true, length: 1..40 
    property :lat,     Float 
    property :long,    Float 

    property :current_population, Integer 

    belongs_to :province, 'Province', 
    parent_key: [:name_short], 
    child_key: [:province] 

end 

我創建相關記錄

然後執行municipality.save,由於它正試圖保存的記錄(請參見下文)試圖將整個Province對象用作關鍵字,而不僅僅是:name_short字段,所以失敗。

#<Municipality @province=#<Province @name_short="BC" @name_long="British Columbia"> @name="100 mile house" @lat=51.64300975 @long=121.295022 @current_population=0> 

我在做什麼錯?

save錯誤返回一個驗證錯誤類型:

["Province must be at most 2 characters long", "Province must be of type String"] 

嗯。再看看這個,我想知道DataMapper可能不會強制引用完整性(通過將父鍵插入新的子節點本身),並且我可能必須通過在本市設置省字段來完成此操作。我會稍微嘗試一下,不會修復它。

UPDATE:奇怪,但通過添加以下to_s方法將Province類,我擺脫了"Province must be at most 2 characters long"錯誤的 - 但仍得到字符串錯誤:

def to_s 
    @short_name 
end 
+0

通過向'Province'類添加'to_s'方法修復了一個錯誤(2個字符)後的帖子。 – 2013-02-23 22:53:27

回答

0

好吧,似乎一個不應該將您的關鍵屬性命名爲與關聯類相同的名稱(感謝DataMapper Google Group的成員爲我指出了正確的方向)。

通過重命名所有:province屬性:prov,並改變所有:province鍵引用,在belongs_tohas n報關,:prov,似乎現在的工作。

我使用p = Province.get('ON')/m = Municipality.new(...)p.municipalities << m還節省,緊隨其後,p.save(不知道我是否應該使用p.municipalities.save代替)。

注意:我正在使用p.municipalities.save,一切正常。