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

関連するレコードを次のように作成します。

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

次にmunicipality.save、を実行します。これは、保存しようとしているレコード(以下を参照)が:name_shortフィールドだけでなく、Provinceオブジェクト全体をキーとして使用しようとしているため失敗します。

#<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が(親キーを新しい子に挿入することによって)参照整合性を強制しないのではないかと思います。おそらく、自治体の州フィールドを自分で設定することによってこれを行う必要がありますか?少し試してみます...いいえ、修正されませんでした。

更新:奇妙ですがto_s、クラスに次のメソッドを追加することProvinceで、エラーを取り除き"Province must be at most 2 characters long"ましたが、それでも文字列エラーが発生します:

def to_s
  @short_name
end
4

1 に答える 1

0

了解しました。キープロパティに関連するクラスと同じ名前を付けるべきではないようです(正しい方向を示してくれたDataMapper Googleグループのメンバーに感謝します)。

すべての: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おり、すべてが機能します。

于 2013-02-24T06:52:13.053 に答える