2011-04-05 66 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