共享外键

时间:2012-04-17 04:48:08

标签: ruby-on-rails database-design

我正在寻找以下设计方法。我有三个模型[区域,组,项目],用于生成树状菜单(祖先宝石)

class Region < ActiveRecord::Base
 has_many :groups
 has_many :items
end


class Group < ActiveRecord::Base
 belongs_to :region
 has_many :items
 has_ancestry
end

class Item < ActiveRecord::Base
 belongs_to :region
 belongs_to :group
end

正如您所看到的,为了构建一个menutree,我将一个区域分配给了group和item:Region(s)=&gt; Group(s)=&gt;项目(S)。

项目的区域在整个应用程序中被广泛使用,但是组的区域仅在呈现菜单时使用。

我不喜欢该组的区域可能与其任何项目的区域或其任何后代不同。我确信从组中继承该项目的区域是不合适的,因为项目可能没有组,组也不能从项目的唯一区域继承其区域(因为如果包含不同区域的项目)在同一组中,同一组在不同地区会出现两次)

有人可以提出另一种方法吗?

1 个答案:

答案 0 :(得分:0)

我有GroupedItemUngroupedItemItem继承:

class Item < ActiveRecord::Base
end

class GroupedItem < Item
  belongs_to :group
end

class UngroupedItem < Item
  belongs_to :region
end

您需要在type表中添加Items列。 More information关于使用ActiveRecord的单表继承。