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

时间:2019-02-18 06:56:36

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

我试图弹出一个模式,该模式应显示具有“玩家”角色的用户,我实现了三个表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

在我的团队管理员中

def load_users
              @user = User.includes(:userroles).where('userroles.name = ?',"Player")

                respond_to do |format|
                  format.html
                  format.js
                  format.json
                end

            end

日志显示以下错误

  

错误(SQLite3 :: SQLException:没有这样的列:userroles.name:SELECT   “用户”。*从“用户”位置(userroles.name ='Player'):

2 个答案:

答案 0 :(得分:1)

默认情况下,includes不执行left join,而是执行两个单独的数据库查询。不过,您可以轻松强制left join,在这种情况下就可以这样做:

@user = User.includes(:user_roles).where(user_roles: { name: 'Player' })

通过使用user_roles: { }表示法,您可以通过user_roles列让ActiveRecord知道您要查询数据库,并且ActiveRecord决定执行left join。如果您没有容易转换为该表示法的条件,则可以使用left join强制eager_load

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

答案 1 :(得分:0)

您需要保持表名一致:

错误:

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")