Sql Rails:具有连接的作用域具有多个
我正在尝试在Rails 4中创建一个角色系统: 用户是一个用户帐户。 一个项目是多个用户可以编辑的 角色是将用户与项目联系起来的东西。规则具有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
用户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)