在我的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表单。
答案 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
我对此进行了测试,确实有效。但有点儿。