30

我想在 RoR 应用程序中自我引用模型,但我不知道具体如何。我想保存一个链表,其中下一个节点具有前一个节点的 id。我该怎么做?这是一对一的关系。

4

3 回答 3

74

最简单的方法:

class MyModel < ActiveRecord::Base
  belongs_to :parent, :class_name => 'MyModel'
  has_many :children, :class_name => 'MyModel', :foreign_key => 'parent_id'
end
于 2011-05-23T13:09:23.050 回答
24

导轨 5

在 users 表中添加列 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

它们被称为自联接

于 2018-03-13T07:14:22.020 回答
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
于 2013-08-10T06:20:08.463 回答