Ruby DataMapper一对多协会赢得';无法使用:父项保存

Ruby DataMapper一对多协会赢得';无法使用:父项保存,ruby,datamapper,ruby-datamapper,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_sho

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

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)
然后执行
university.save
,该操作失败,因为它试图保存的记录(见下文)试图使用整个省对象作为键,而不仅仅是:name_短字段

#<Municipality @province=#<Province @name_short="BC" @name_long="British Columbia"> @name="100 mile house" @lat=51.64300975 @long=121.295022 @current_population=0>
嗯,再看一眼,我想知道DataMapper本身是否没有强制引用完整性(通过将父键插入到新的子项中),并且我可能必须通过在自治区中设置省字段来实现这一点?我会尝试一下。。。不,那没有解决问题

更新:奇怪,但是通过将以下
添加到
Province
类的
方法中,我摆脱了
“Province必须最多2个字符长”
错误-但仍然得到字符串错误:

def to_s
  @short_name
end

好吧,似乎你不应该把你的密钥属性命名为与你相关的类相同的名称(感谢DataMapper Google小组的一名成员为我指明了正确的方向)

通过将所有
:province
属性重命名为
:prov
,并将所有
:province
关键引用更改为
中的
属于
,并且
中有n个
声明,改为
:prov
,现在似乎可以工作了


我还使用
p=Province.get('ON')
/
m=communication.new(…)
p.communications更新了post,通过将
添加到
Province
类的
方法中,修复了其中一个错误(2个字符)。
def to_s
  @short_name
end