我目前正在开发一个基于现有数据库的新应用程序,利用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'
来使用普通字段来完成,但我找不到关联的方法。
答案 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获得答案。