2009-12-31 131 views
2

我目前正在開發基於現有數據庫的新應用程序,利用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'與正常字段完成,但我沒有發現這種方式的關聯。

回答

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的答案。