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

时间:2009-10-01 20:35:20

标签: ruby-on-rails orm 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错误地将我的显式映射误认为是为了创建新的关联?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

如果您可以提供有关您的用例的更多信息,可能有助于我们确定是否有其他方法可以解决您的问题。

答案 2 :(得分:0)

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

我查看了DataMapper,我发现它确实specifially address这个问题:

  

数据库中的一行   应该等于一个对象引用。   很简单的想法。非常深刻   影响。如果您运行以下代码   在ActiveRecord中,你会看到所有的错误   结果。在DataMapper中执行相同的操作   它一直都是真的......

答案 3 :(得分:0)

对于那些在被问到这些年后遇到困难的人(像我一样!),请查看https://stackoverflow.com/a/4116397/1000655

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