DataMapper关联中的外键名称

时间:2009-12-31 22:52:32

标签: ruby 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'来使用普通字段来完成,但我找不到关联的方法。

1 个答案:

答案 0 :(得分:5)

感谢Jan De Poorter very helpful blog entry,我第一次找到了自己问题的答案。

在处理字段名称时,有必要调整约定,以便它只使用符号的名称,而不是使用内置的关于下划线的智能。

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获得答案。