Rails Rails 中如何设置自连接类型

ytwman · 2013年09月01日 · 最后由 messiahxu 回复于 2013年09月12日 · 4091 次阅读

有一个 model 存放地区列表,使用 parent_id 保存上级节点的 id,如何配置关系才能实现自连接呢? 从网上查了下,感觉和我这个不太一样,不明白他的 manager 和 mentor 什么意思。

自连接

对于表中的一个记录连接同一个表中的另一个记录也是可能发生的。举个例子,公司里每一个雇员有一个manager和一个mentor,这两个也是雇员。在Rails你可以这样建模。

class Employee < ActiveRecord::Base

belongs_to :manager,

:class_name => "Employee",

:foreign_key => "manager_id"

belongs_to :mentor,

:class_name => "Employee",

:foreign_key => "mentor_id"

has_many :mentored_employees,

:class_name => "Employee",

:foreign_key => "mentor_id"

has_many :managed_employees,

:class_name => "Employee",

:foreign_key => "manager_id"

end

让我们加载一些数据。Clem和Dawn每个都一个mamager和一个mentor。
class Child < ActiveRecord::Base
belongs_to :parent
end

class Parent < ActiveRecord::Base
has_many :children
end

在 migration 里建 children 表的时候加一个 parent_id 字段就关联上了, 然后就可以 parent.chindren 那样调用了

rails g model Employee name:string manager_id:integer
rake db:migrate
class Employee < ActiveRecord::Base
    has_many :subordinates, class_name: "Employee", foreign_key: "manager_id"
    belongs_to :manager, class_name: "Employee"
end

manager = Employee.create(name: "test_of_manager")
s = manager.subordinates.create(name: "test_of_subordinate")
manager.subordinates
s.manager

#2 楼 @messiahxu 用了一个小插件就实现了。多谢了

class Area < ActiveRecord::Base
  include ActsAsTree
  extend ActsAsTree::Presentation

  acts_as_tree :order => "id"

  validates_presence_of   :name
  validates_uniqueness_of :name, scope: [:code, :zip_code]

end

#3 楼 @ytwman 原生支持的干嘛要用插件……

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册