Error: while querying a tables with has many through relationship in rails
Error: while querying a tables with has many through relationship in rails
我正在尝试弹出一个模式,它应该显示具有角色 "player" 的用户,我实现了三个 tables 用户角色和用户角色,其中用户和角色具有许多通过关联用户角色 table.
条件如下
一个用户可以是玩家或管理员或两者兼而有之,
在显示时,我们应该显示角色为玩家的用户。
架构
create_table "roles", force: :cascade do |t|
t.string "name"
t.boolean "active"
t.integer "counter"
end
create_table "user_roles", force: :cascade do |t|
t.integer "role_id"
t.integer "user_id"
t.index ["role_id"], name: "index_user_roles_on_role_id"
t.index ["user_id"], name: "index_user_roles_on_user_id"
end
create_table "users", force: :cascade do |t|
t.string "first_name"
t.string "last_name"
t.string "email"
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
t.index ["team_id"], name: "index_users_on_team_id"
end
table模型如下
class User < ApplicationRecord
has_many :user_roles
has_many :roles, through: :user_roles, :dependent => :destroy
end
class UserRole < ApplicationRecord
belongs_to :role
belongs_to :user
validates :user_id, :uniqueness => { :scope => :role_id }
end
class Role < ApplicationRecord
has_many :user_roles
has_many :users, through: :user_roles ,:dependent => :destroy
end
在团队控制器中我有
def load_users
@user = User.includes(:userroles).where('userroles.name = ?',"Player")
respond_to do |format|
format.html
format.js
format.json
end
end
日志显示以下错误
Error (SQLite3::SQLException: no such column: userroles.name: SELECT
"users".* FROM "users" WHERE (userroles.name = 'Player')):
默认情况下,includes
不执行 left join
而是执行两个单独的数据库查询。不过,您可以轻松强制 left join
,在这种情况下,这样做就足够了:
@user = User.includes(:user_roles).where(user_roles: { name: 'Player' })
通过使用 user_roles: { }
表示法,您让 ActiveRecord 知道您还想通过 user_roles
列查询数据库,并且 ActiveRecord 决定执行 left join
。如果您的条件无法轻松转换为此表示法,则可以使用 eager_load
:
强制 left join
@user = User.eager_load(:user_roles).where('some complex SQL query including user_roles column(s)')
您需要保持 table 名称一致:
错误:
User.includes(:userroles).where("userroles.name = ?","Player")
右(带下划线)
User.includes(:user_roles).where("user_roles.name = ?","Player")
附录(我现在不在我的开发机器上,所以这是未经测试的)
User.joins(:user_roles).where("user_roles.name = ?", "Player")
我正在尝试弹出一个模式,它应该显示具有角色 "player" 的用户,我实现了三个 tables 用户角色和用户角色,其中用户和角色具有许多通过关联用户角色 table.
条件如下 一个用户可以是玩家或管理员或两者兼而有之, 在显示时,我们应该显示角色为玩家的用户。
架构
create_table "roles", force: :cascade do |t|
t.string "name"
t.boolean "active"
t.integer "counter"
end
create_table "user_roles", force: :cascade do |t|
t.integer "role_id"
t.integer "user_id"
t.index ["role_id"], name: "index_user_roles_on_role_id"
t.index ["user_id"], name: "index_user_roles_on_user_id"
end
create_table "users", force: :cascade do |t|
t.string "first_name"
t.string "last_name"
t.string "email"
t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
t.index ["team_id"], name: "index_users_on_team_id"
end
table模型如下
class User < ApplicationRecord
has_many :user_roles
has_many :roles, through: :user_roles, :dependent => :destroy
end
class UserRole < ApplicationRecord
belongs_to :role
belongs_to :user
validates :user_id, :uniqueness => { :scope => :role_id }
end
class Role < ApplicationRecord
has_many :user_roles
has_many :users, through: :user_roles ,:dependent => :destroy
end
在团队控制器中我有
def load_users
@user = User.includes(:userroles).where('userroles.name = ?',"Player")
respond_to do |format|
format.html
format.js
format.json
end
end
日志显示以下错误
Error (SQLite3::SQLException: no such column: userroles.name: SELECT "users".* FROM "users" WHERE (userroles.name = 'Player')):
默认情况下,includes
不执行 left join
而是执行两个单独的数据库查询。不过,您可以轻松强制 left join
,在这种情况下,这样做就足够了:
@user = User.includes(:user_roles).where(user_roles: { name: 'Player' })
通过使用 user_roles: { }
表示法,您让 ActiveRecord 知道您还想通过 user_roles
列查询数据库,并且 ActiveRecord 决定执行 left join
。如果您的条件无法轻松转换为此表示法,则可以使用 eager_load
:
left join
@user = User.eager_load(:user_roles).where('some complex SQL query including user_roles column(s)')
您需要保持 table 名称一致:
错误:
User.includes(:userroles).where("userroles.name = ?","Player")
右(带下划线)
User.includes(:user_roles).where("user_roles.name = ?","Player")
附录(我现在不在我的开发机器上,所以这是未经测试的)
User.joins(:user_roles).where("user_roles.name = ?", "Player")