有没有办法确保ActiveRecord层次结构中每个记录有一个对象引用?

当我抓住一些分层的ActiveRecord结构时,似乎有很多数据库命中。 我使用:include选项改进了这一点,以尽可能多地充实结构。 即便如此,似乎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错误地将我的显式映射误认为是为了创建新的关联?

所以,如果你有一个节点,它有一个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 

不幸的是,我认为你被困住了。 这不是ActiveRecord所支持的,据我所知,没有计划支持它。 正如您在Sarah Mei引用的问题中所看到的,它可能存在一些可能的问题。

如果您可以提供有关您的用例的更多信息,可能有助于我们确定是否有另一种方法来处理您的问题。

我根本不认为ActiveRecord旨在支持这个想法。 它只是意味着你必须使用ActiveRecord,了解它的优点和缺点。 我已经找到了解决这个问题的方法。

我看过DataMapper,我发现它确实特别解决了这个问题:

数据库中的一行应该等于一个对象引用。 非常简单的想法。 相当深刻的影响。 如果在ActiveRecord中运行以下代码,您将看到所有错误结果。 在DataMapper中做同样的事情,它一直都是真的……

对于那些在被问到这些年后偶然发现的人(比如我!),请查看https://stackoverflow.com/a/4116397/1000655 。

它建议使用:inverse_of来设置双向关联。 我希望我过去没多次浏览过那么多文档!