2013-02-23 3 views
0

У меня есть установка следующая модель с конкретными материнскими и дочерними ключами:Рубин DataMapper Один-ко-многим ассоциации не будет экономить с помощью: parent_key

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.

#<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

Обновлено сообщение с исправлением одной из ошибок (2 символа), добавив метод 'to_s' в класс« Провинция ». –

ответ

0

Хорошо, это, кажется, не следует назовите свои ключевые свойства такими же, как ваши ассоциированные классы (благодаря члену группы DataMapper Google Group для указания меня в правильном направлении).

Переименования всего :province свойства :prov и изменять все :province ключевых ссылки, в belongs_to и has n декларациях, к :prov, кажется, работает в настоящее время.

Я также экономить с помощью p = Province.get('ON')/m = Municipality.new(...) и p.municipalities << m, а затем с p.save (не уверен, должен ли я использовать p.municipalities.save вместо этого).

ПРИМЕЧАНИЕ: Я использую p.municipalities.save и все работает.

 Смежные вопросы

  • Нет связанных вопросов^_^