Rails:has_many中的连接范围

时间:2015-10-18 10:36:14

标签: sql ruby-on-rails ruby ruby-on-rails-4 rails-activerecord

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

用户是用户帐户。 项目是多个用户可能编辑的内容。

角色是将用户与项目联系起来的东西。规则包含user_idproject_idrole_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的限制还是我做错了什么?

0 个答案:

没有答案