Имя внешнего ключа в ассоциациях DataMapper

В настоящее время я работаю над новым приложением, основанным на существующей базе данных, используя DataMapper для доступа к данным. Однако его соглашения при работе с внешними ключами — это не то, что использует база данных.

Пример:

class Invoice
  include DataMapper::Resource

  storage_names[:default] = 'invoices'

  property :id, Serial
  # ... more properties ...

  has n, :items
end

class Item
  include DataMapper::Resource

  storage_names[:default] = 'invoiceItems'

  property :id, Serial
  # ... more properties ...

  belongs_to :invoice  # this should use 'invoiceId' instead of 'invoice_id'
end

Есть ли способ, которым я могу заставить внешний ключ, используемый DataMapper, быть «invoiceId», а не «invoice_id», который он пытается использовать в данный момент (как указано в комментарии выше)? Я знаю, что это можно сделать с обычными полями, добавив :field => 'fieldName', но я не нашел такого способа для ассоциаций.


person Mark Embling    schedule 31.12.2009    source источник


Ответы (1)


И не в первый раз я нашел ответ на свой вопрос благодаря очень полезная запись в блоге.

При работе с именами полей необходимо скорректировать соглашения, чтобы они просто использовали имя символа, а не использовали его встроенные возможности в отношении символов подчеркивания.

repository(:default).adapter.field_naming_convention = lambda { |value| value.name.to_s }

Затем имя внешнего ключа можно указать следующим образом:

class Invoice
  # bla bla...
  has n, :items, :child_key => [:invoiceId]
end

class Item
  # bla bla...
  belongs_to :invoice, :child_key => [:invoiceId]
end

Стоит отметить (как показано выше), что имя ключа должно быть указано на обеих сторонах отношения (что я нахожу немного странным, но эй). Надеюсь, это поможет всем, кто задает тот же вопрос. Спасибо Jan De Poorter за ответ.

person Mark Embling    schedule 01.01.2010