当我抓住一些分层的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错误地将我的显式映射误认为是为了创建新的关联?
答案 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
设置双向关联。我希望过去我没有多次浏览过那些文档!