特定の親キーと子キーを使用して次のモデルを設定しました。
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