Sql 错误:在rails中查询具有多直通关系的表时

Sql 错误:在rails中查询具有多直通关系的表时,sql,ruby-on-rails,ruby,sqlite,rails-activerecord,Sql,Ruby On Rails,Ruby,Sqlite,Rails Activerecord,我试图弹出一个模式来显示角色为“player”的用户,我实现了三个表user role和userrole,其中user和role通过userrole表进行关联 条件如下 一个用户可以是玩家或管理员,或者两者都是, 在显示时,我们应该显示具有角色的用户,仅限玩家 模式 create_table "roles", force: :cascade do |t| t.string "name" t.boolean "active" t.integer "counter" en

我试图弹出一个模式来显示角色为“player”的用户,我实现了三个表user role和userrole,其中user和role通过userrole表进行关联

条件如下 一个用户可以是玩家或管理员,或者两者都是, 在显示时,我们应该显示具有角色的用户,仅限玩家

模式

 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
表格模型如下所示

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
日志显示以下错误

错误(SQLite3::SQLException:没有这样的列:userroles.name:选择 “用户”。*来自“用户”,其中(userroles.name='Player'):


默认情况下,
includes
不执行
left join
,而是执行两个单独的DB查询。您可以轻松地强制
左连接
,但在这种情况下,只需执行以下操作即可:

@user = User.includes(:user_roles).where(user_roles: { name: 'Player' })
通过使用
user\u roles:{}
符号,您可以让ActiveRecord知道您也想通过
user\u roles
列查询数据库,ActiveRecord决定执行
左连接
。如果您不具备可轻松转换为此符号的条件,则可以使用
eager\u load
强制
左连接

@user = User.eager_load(:user_roles).where('some complex SQL query including user_roles column(s)')

您需要保持表名的一致性:

错:

User.includes(:userroles).where("userroles.name = ?","Player")
右(带下划线)

附录(我现在不在我的开发机器上,所以这是未经测试的)


不应该
userroles
user\u roles
?这对我来说很有效@user=user。包括(:roles)。其中(roles:{name:'Player'})@gangothri,对不起,我没有注意到你的回答。是的,这是正确的,因为user_roles表没有
name
字段
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")