0

请帮忙。

我有一个自引用模型,并希望外键引用范围内的非主键。

在列表表中,我有一个 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
4

2 回答 2

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 :parentActiveRecord 指示parent_id在列表表中查找列,该列应该是has_many关系中引用的外键。

于 2012-10-16T07:04:47.393 回答
0

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

从概念上讲,这是可能的,因为模型中的每条记录List都将由其sequence_id 其唯一标识listset_id,原因是sequence_id在 a 范围内是唯一的listset_id

但是,我认为您不能以这种方式安全地操纵belongs_to以找到List's 父母。根据railsguides

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

也就是说,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} }

这可能会导致意外的行为,因为belongs_to仍然期望使用主键来识别关联的模型。

虽然,我不完全确定这是否是你想要的。让我们知道。

于 2012-10-16T08:12:58.233 回答