Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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/2/ruby-on-rails/60.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
Sql Rails:具有连接的作用域具有多个_Sql_Ruby On Rails_Ruby_Ruby On Rails 4_Rails Activerecord - Fatal编程技术网

Sql Rails:具有连接的作用域具有多个

Sql Rails:具有连接的作用域具有多个,sql,ruby-on-rails,ruby,ruby-on-rails-4,rails-activerecord,Sql,Ruby On Rails,Ruby,Ruby On Rails 4,Rails Activerecord,我正在尝试在Rails 4中创建一个角色系统: 用户是一个用户帐户。 一个项目是多个用户可以编辑的 角色是将用户与项目联系起来的东西。规则具有用户id、项目id和角色类型id 根据角色类型的等级,用户可能对某个项目拥有更多权限 现在,我试图建立这些模型之间的关系。但是,生成的SQL查询似乎是错误的。我错过了什么 project.rb: class Project < ActiveRecord::Base has_many :user_roles, -> {user_roles.e

我正在尝试在Rails 4中创建一个角色系统:

用户是一个用户帐户。 一个项目是多个用户可以编辑的

角色是将用户与项目联系起来的东西。规则具有
用户id
项目id
角色类型id

根据角色类型的
等级
,用户可能对某个项目拥有更多权限

现在,我试图建立这些模型之间的关系。但是,生成的SQL查询似乎是错误的。我错过了什么

project.rb:

class Project < ActiveRecord::Base
  has_many :user_roles, -> {user_roles.eager_load(:role_type)}, class_name: "Role"
  has_many :users, through: :user_roles
  has_many :admin_roles, -> {admin_roles}, class_name: "Role"
  has_many :admins, through: :admin_roles, source: :users
  has_many :creator_roles, -> {creator_roles}, class_name: "Role"
  has_many :creators, through: :creator_roles, source: :user
end
我已经尝试了所有的
连接()
包含()
渴望加载()
以及使用一个
默认作用域将列组类型表与列组类型表连接起来。但问题依然存在


似乎在使用
has\u many:through
关系时,在作用域中指定的
eager\u load()
不会添加到生成的SQL中。这是Rails的限制还是我做错了什么?

目前无法给出一个好的解决方案或解释,但为什么不使用gem在应用程序中引入角色系统呢?到目前为止,我已经在需要基于角色的用户的任何地方使用过这个工具,我对此非常满意。我认为CanCanCan只处理静态权限(即,不特定于资源)。看来我弄错了。我一定去看看。尽管如此,我还是希望回答这个问题,因为上面的权限案例只是出现此问题的多种情况之一。我不熟悉
的lambda语法有很多
,但是您似乎渴望加载
-ing
角色类型
。一次在作用域中,一次在调用该作用域的关联中。类似于
的东西有很多:用户角色,->{joins(:role\u type)。其中(“role\u types.rank=1”)},类名称:'role'
和SQL需要单-=,而不是双-=。
class Role < ActiveRecord::Base
  belongs_to :user
  belongs_to :project
  belongs_to :role_type

  scope :user_roles,    ->{eager_load(:role_type).where("role_types.rank = 1").select("roles.*,role_types.*")}
  scope :admin_roles,   ->{eager_load(:role_type).where("role_types.rank = 2").select("roles.*,role_types.*")}
  scope :creator_roles, ->{eager_load(:role_type).where("role_types.rank = 3").select("roles.*,role_types.*")}
end
  2.2.1 :007 > Project.first.users
  Project Load (0.2ms)  SELECT  "projects".* FROM "projects"  ORDER BY "projects"."id" ASC LIMIT 1
  User Load (1.2ms)  SELECT "users".* FROM "users" INNER JOIN "roles" ON "users"."id" = "roles"."user_id" WHERE "roles"."project_id" = ? AND (role_types.rank = 1)  [["project_id", 1]]
SQLite3::SQLException: no such column: role_types.rank: SELECT "users".* FROM "users" INNER JOIN "roles" ON "users"."id" = "roles"."user_id" WHERE "roles"."project_id" = ? AND (role_types.rank = 1)
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: role_types.rank: SELECT "users".* FROM "users" INNER JOIN "roles" ON "users"."id" = "roles"."user_id" WHERE "roles"."project_id" = ? AND (role_types.rank = 1)