如何在Ruby on Rails中进行自我引用?

34

我想在 RoR 应用程序中自引用模型,但我不确定该怎么做。我想要保存一个链表,其中下一个节点具有前一个节点的 id。如何按照 Rails 的方式实现呢?这是一种一对一的关系。


我认为你可以从StackOverflow上搜索“[ruby-on-rails] self referential association”开始:http://stackoverflow.com/search?q=%5Bruby-on-rails%5D%20self%20referential%20association - 有重复吗? :-) - conny
3
实际上,我搜索了这个问题,但是它们并没有解决我的问题。 - JRafaelM
3个回答

82

最简单的方法:

class MyModel < ActiveRecord::Base
  belongs_to :parent, :class_name => 'MyModel'
  has_many :children, :class_name => 'MyModel', :foreign_key => 'parent_id'
end

我正在使用Rails 3,我只需要一个引用而不是多个,has_one可以吗?如果可以,那么我做错了什么。 - JRafaelM
完美的答案!! - Jigar Bhatt

29

Rails 5

在用户表中添加 xxx_id 列:

在迁移文件中:

add_reference :users, :xxx, index: true

并在用户模型中添加代码

has_many :users, class_name: 'User', foreign_key: 'xxx_id'
belongs_to :manager, class_name: 'User', foreign_key: 'xxx_id'

如果每个用户都没有经理,那么您需要添加optional:true。

'foreign_key'不是必需的。默认情况下,它被猜测为小写的类名加上“_id”后缀。

如果foreign_key是user_id,用户就不需要经理了。结果如下:

has_many :users, class_name: 'User'
belongs_to :manager, class_name: 'User', optional: true

它们被称为自关联


3

我花了一些时间尝试使用Rails 3.2.14让它工作起来。

对于自连接关联,文档的建议对于belongs_to关联没有起作用。添加外键解决了这个问题。

Class User < ActiveRecord::Base
  has_many :invitees, class_name: 'User', foreign_key: :invited_by
  belongs_to :host, class_name: 'User', foreign_key: :invited_by
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接