Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 通过自继承STI模型获得关联_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

Ruby on rails 通过自继承STI模型获得关联

Ruby on rails 通过自继承STI模型获得关联,ruby-on-rails,ruby,activerecord,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用户:organization\u id 结束 类子域

在我的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用户
用户需要通过组织的任何级别管理表单

class AdminRole < ActiveRecord::Base
  belongs_to :organization
  belongs_to :user
end
class AdminRole
如果分配给非部门组织,他们控制的表格应通过子部门提交

表格仅分配给部门级别。 我的组织模型是一个三级STI模型:市场>子领域>部门

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>BarDomain>LoremDepartment的层次结构 以及与LoremDepartment关联的表单。
如果用户通过AdminRole绑定到这3个组织中的任何一个,那么它将允许返回LoremDepartment表单。

您必须使用关联吗?你总是可以在用户模型中定义一个实例方法,并将其回溯到表单。 但在此之前,提醒一下,您必须在两个模型中都提到外键,以便关联以两种方式工作

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
class用户:管理员角色
def表格
organizations.map(&:forms).flatte.uniq
结束
结束
班级部门组织
属于:子\u域、主\u密钥::id、外部\u密钥::父\u id
有多个:表单,:外键=>:organization\u id
结束
类子域<组织
属于:市场,主密钥::id,外部密钥::父密钥
有多个:部门、外键::父id
def表格
部门。地图(&:表格)。展平
结束
结束
阶级市场组织
有多个子域,外键::父id
def表格
sub_domains.map(&:forms).展平
结束
结束

我测试了这个,它确实有效。但是有点绕圈。

很棒的回答:D.只有一个问题,我可能需要从表单回到用户。我是否可以构建一个类似的调用堆栈,然后再反过来呢?嗯,首先你需要正确地建立关联。表单有一个部门,表单属于这个部门,因为你已经有很多了。你必须这样做。表单将属于一个部门,如果您在组织中有许多属于用户,则可以直接执行表单\ u object.department.users。对于其他两个STI模型,你需要稍微计算一下。如果它对你有效,请接受答案。事实上,我创建了这些模型并将其计算出来;):DYea我想我需要获得Dept及其分层组织结构,然后将其与AdminRoles表进行比较,以查看用户有哪些访问权限。