通过自我继承的STI模型获得关联

时间:2015-03-12 17:03:11

标签: ruby-on-rails ruby activerecord

在我的Rails应用程序中,我有用户和表单。

class User < ActiveRecord::Base
  has_many :admin_roles
  #desired association below
  #has_many :forms, through: :admin_roles
end
class Form < ActiveRecord::Base
  has_one :department
end

用户需要通过组织的任何级别管理表单。

class AdminRole < ActiveRecord::Base
  belongs_to :organization
  belongs_to :user
end

如果分配给非部门组织,他们可以控制的表格应该通过子部门。

表格仅分配到部门级别。 我的组织模型是3个级别的STI模型:市场&gt;子域&gt;部门

class Organization < ActiveRecord::Base
  self.inheritance_column = :org_level
  has_many :admin_roles
end
class Department < Organization
  belongs_to :sub_domain, primary_key: :id, foreign_key: :parent_id
  has_many :forms
end
class SubDomain < Organization
  belongs_to :market, primary_key: :id, foreign_key: :parent_id
  has_many :departments
end
class Market < Organization
  has_many :sub_domains
end

所需的功能是user.forms并获取所有相关表格。

例如:鉴于FooMarket的层次结构&gt; BarDomain&gt; LoremDepartment 和LoremDepartment相关的表格。 如果用户通过AdminRole绑定到这3个组织中的任何一个,则允许返回LoremDepartment表单。

1 个答案:

答案 0 :(得分:2)

你必须与协会一起做吗?你总是可以在用户模型中定义一个实例方法,并将其跟踪到表单。 但在此之前,只需提醒一下,您必须在两个模型中提及外键,以便协会双向工作。

class User < ActiveRecord::Base
  attr_accessible :name
  has_many :admin_roles
  has_many :organizations, :through => :admin_roles

  def forms
    organizations.map(&:forms).flatten.uniq
  end
end

class Department < Organization
  belongs_to :sub_domain, primary_key: :id, foreign_key: :parent_id
  has_many :forms, :foreign_key => :organization_id
end

class SubDomain < Organization
  belongs_to :market, primary_key: :id, foreign_key: :parent_id
  has_many :departments, foreign_key: :parent_id

  def forms
    departments.map(&:forms).flatten
  end
end

class Market < Organization
  has_many :sub_domains, foreign_key: :parent_id

  def forms
    sub_domains.map(&:forms).flatten
  end

end

我对此进行了测试,确实有效。但有点儿。