2009-10-01 38 views
2

看起来,当我抓取一些层次结构的ActiveRecord时,有相当多的命中数据库。我使用:include选项改进了这一点,以充实尽可能多的结构。即便如此,ActiveRecord似乎并没有将关系的相对方(例如父子)映射为对记录的唯一引用。也就是说,我们得到了一个可导航的ActiveRecord结构,但据我所知,它并不能保证给定记录的唯一副本。有没有一种方法可以确保ActiveRecord层次结构中每个记录的一个对象引用?

node = Node.find(1, :include => {:document => :node}) 
node.object_id #A 
node.document.node.object_id #B although I expect/desire A 

在ActiveRecord中不可避免的?有其他人因为这样的缺点而转移到其他ORM吗? (不要误解我的意思:ActiveRecord是一个很棒的工具,但是所有的工具都有其优点和缺点)

假设我要写自己的SQL查询(它甚至可以是一个存储过程),返回多个结果集包含我的ActiveRecord层次结构的所有相关数据。有没有一种无痛的方式,我可以明确映射关联,而不会让ActiveRecord错误地显示我的显式映射以尝试创建新的关联?

+0

您可能对此问题感兴趣:http://stackoverflow.com/questions/1303874/why-is-activerecord-not-smart-enough-to-know-that-the-objectid-of-the-father -sho – 2009-10-01 20:55:02

+0

是的,谢谢莎拉。我有点问同样的事情。 – Mario 2009-10-05 12:11:06

回答

0

我根本不认为ActiveRecord被设计来支持这个想法。它只是意味着你必须使用ActiveRecord,了解它的优点和缺点。我从那以后找到了解决这个问题的方法。

我已经看了DataMapper的,我看到它specifially address这个问题:

一行在数据库 应该等于一个对象引用。 非常简单的想法。相当深刻的 影响。如果您在ActiveRecord中运行以下代码 ,您将看到所有虚假的 结果。做相同的DataMapper和 这是真的一路下跌......

0

所以,如果你有一个节点,它有一个parent_id。对于所有节点,父级不能是任何其他节点的父级。换句话说,对于所有节点,parent_id应该是唯一的。

class Node 
    has_one :child, :class_name => "Node", :foreign_key => :parent_id 

    belongs_to :parent, :class_name => "Node" 
    validates_uniqueness_of :parent_id 
end 
0

不幸的是,我认为你被卡住了。这不是ActiveRecord支持的,据我所知,目前还没有计划支持它。正如你在莎拉梅引用的问题中看到的那样,有一些可能的担忧。

如果您可以提供更多有关您的使用案例的信息,它可以帮助我们弄清楚是否有另一种方法来处理您的问题。

+0

这是我怀疑的。我想这与ActiveRecord设计模式本身有关。我可以解决它;我只需要注意这个潜在的困难。 – Mario 2009-10-05 12:08:43

0

对于任何人谁过这个年绊倒有人问后(像我!),检查https://stackoverflow.com/a/4116397/1000655

它建议使用:inverse_of建立双向关联。我希望我过去曾多次浏览过那些文档!

相关问题