Rails使用非主键自引用

时间:2012-10-16 05:08:59

标签: ruby-on-rails model self-reference

请帮忙。

我有一个自引用模型,并希望外键引用一个作用域的非主键。

在列表中,我有一个sequence_id列,其中包含列表集中唯一的列表的增量ID。意味着可以看到相同的sequence_id用于另一个列表集的列表。但是,由于此sequence_id在整个表中并不唯一,因此我没有将其作为主键。

如何使用此非主键实现自引用关系?

非常感谢。

型号:

 Class Listset
       has_many :lists, :dependent => :delete_all
       has_many :items, :through => :lists
    end

    Class List
       belongs_to :listset

       belongs_to :parentList, :class_name => "List"
       has_many :childList, :class_name => "List", foreign_key => "parent"

       has_many :items, :dependent => :delete_all
    end

    Class item
        belongs_to :list
    end

2 个答案:

答案 0 :(得分:0)

您能否澄清一下您对sequence_id的看法?

这应该有助于您的自我引用关系:

class List < ActiveRecord::Base
  belongs_to :listset
  belongs_to :parent,      :class_name => "List"
  has_many   :child_lists, :class_name => "List", :foreign_key => "parent_id"
  # etc...
end

这假设您在数据库表中有一个parent_id列。

Rails中的约定是强调命名关系,即:child_lists而不是:childList

使用belongs_to :parent指示ActiveRecord在列表中查找parent_id列,该列应该是has_many关系中引用的外键。

答案 1 :(得分:0)

如果我理解正确,您已经知道如何使用主键建模自引用关系。每个List只有一个parent_id,引用其他Listsid(这是一个主键)。我想您所问的是,您是否可以使用非主键sequence_id而非默认主键id来建模自引用关系。

概念,这是可能的,因为List模型中的每条记录都会由sequence_id {{1}唯一标识因为listset_idsequence_id范围内是唯一的。

但是,我不认为你可以安全地操纵listset_id以这种方式找到belongs_to的父母。根据{{​​3}},

  

...通过声明一个模型belongs_to另一个模型,指示Rails在两个模型的实例之间维护主键 - 外键信息......

也就是说,List期望使用作为主键的外键来查找记录。虽然您可以尝试belongs_to根据belongs_to范围和listset_id标识父级,但需要

sequence_id

这可能会导致意外行为,因为belongs_to :parent_list, foreign_key: :parent_id, class_name: "List", conditions: proc { {:listset_id => listset_id, :sequence_id => parent_id} } 仍然希望使用主键来识别关联的模型。

尽管如此,我并不完全确定这是不是你想要的。请告诉我们。