请帮忙。
我有一个自引用模型,并希望外键引用一个作用域的非主键。
在列表中,我有一个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
答案 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
,引用其他Lists
个id
(这是一个主键)。我想您所问的是,您是否可以使用非主键sequence_id
而非默认主键id
来建模自引用关系。
概念,这是可能的,因为List
模型中的每条记录都会由sequence_id
和 {{1}唯一标识因为listset_id
在sequence_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} }
仍然希望使用主键来识别关联的模型。
尽管如此,我并不完全确定这是不是你想要的。请告诉我们。