2011-04-05 67 views
1

我有兩個表,nodestermsDataMapper通過外鍵獲取值

nodes相關字段是:nid(主鍵)和value
terms,它們是:valuetid,和nid,其中valuetid一起是主鍵和nid是一個外鍵引用nodes.nid 。我想將記錄添加到terms。我有tidnid,以及value我想從相應的node--例如查詢value對於給定的nidnode,然後將其作爲valueterms中。

辦法做到這在SQL可能是:

INSERT INTO terms(tid, nid, value) 
values(mytid, mynid, (
    select value from nodes where nid=mynid 
)); 

有人能幫助我的DataMapper做到這一點?

class Node 
    include DataMapper::Resource 

    property :nid, Serial, :key => true 
    property :value, Integer 

end 


class Term 
    include DataMapper::Resource 

    property :tid, Integer, :key => true 

    # how do I define nid and value? 
end 

# and then what do I give to Term.new or Term.create and how? 

如果任何人都可以指點我一個DataMapper的好教程,我會很感激。我一直在使用他們的在線文檔,但我發現我發現自己的情況很少覆蓋。

+0

我找到了文檔的OK,但支持在IRC上很棒。看看我有下面的問題。答案解釋瞭如何對他們進行關係和查詢。 http://stackoverflow.com/questions/2826439/beginning-with-datamapper-association-question – 2011-04-05 19:02:32

回答

1

從你的描述,你要尋找的模式應該是建立這樣的:

class Node 
    include DataMapper::Resource 

    property :nid, Serial 
    property :value, Integer 
end 

class Term 
    include DataMapper::Resource 

    property :tid, Integer, :key => true 
    property :value, Integer, :key => true 

    belongs_to :node, :child_key => :nid 
end 

,您可以用這些模型這樣的工作:

# create a node 
node = Node.create(:value => 123) 

# create a term and associate it with the node 
term = Term.create(:tid => 321, :node => node, :value => node.value) 
+1

感謝您的回答。這真的是唯一的方法嗎?因爲這就是我首先考慮的方法,但我認爲如果我對模型進行了很好的定義,我可以做Term.create(:tid => 321,:nid => 999),並且它將在內部將其轉換爲「使用節點查找999,然後插入tid = 321,nid = 999,vid =無論您在那裏找到什麼」。我可以在Term內部創建一個方法來隱藏細節,但我認爲這可能是DataMapper可以通過良好刷新模型處理的東西。也許這是很多問題。 – hsiu 2011-04-05 21:31:53

+0

你可以設置一個before save hook來做self.value = node.value – solnic 2011-04-05 23:22:05