我正在尝试在Rails 4中创建一个角色系统:
用户是用户帐户。 项目是多个用户可能编辑的内容。
角色是将用户与项目联系起来的东西。规则包含user_id
,project_id
和role_type_id
。
根据roleType的rank
,用户可能拥有某个项目的更多权限。
现在,我正在尝试建立这些模型之间的关系。但是,生成的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
role.rb:
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
调用Project.first.user_roles
(或#admin_roles或#creator_roles)可以正常工作。但是调用Project.first.users
(或#admins或#creators)会产生以下错误:
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)
我尝试了所有joins()
,includes()
和eager_load()
,以及使用将rank_types表与第1列连接起来的default_scope
。但问题保持不变。
似乎在使用has_many :through
关系时,范围中指定的eager_load()
不会添加到生成的SQL中。这是Rails的限制还是我做错了什么?