Ruby DataMapper One-to-Many关联不会使用:parent_key保存

时间:2013-02-23 19:42:17

标签: ruby datamapper ruby-datamapper

我使用特定的父键和子键设置了以下模型:

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

我用以下内容创建关联记录:

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

然后执行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是否不会强制引用完整性(通过将父键插入到新子项中)本身,并且我可能必须通过自己设置Municipality中的Province字段来实现这一点?我会尝试一下......不,没有解决它。

更新:奇怪,但是通过向to_s类添加以下Province方法,我摆脱了"Province must be at most 2 characters long"错误 - 但仍然收到字符串错误:

def to_s
  @short_name
end

1 个答案:

答案 0 :(得分:0)

好吧,似乎不应该将您的关键属性命名为与关联类相同(感谢DataMapper Google Group的成员指出我正确的方向)。

:province:prov声明中,将所有:province属性重命名为belongs_to,并将所有has n个关键字引用更改为{{1} ,它似乎现在有效。

我还使用:prov / p = Province.get('ON')m = Municipality.new(...)保存,然后使用p.municipalities << m(不确定我是否应该使用p.save)。

注意:我使用p.municipalities.save并且一切正常。