【问题标题】:SQLException: no such column with has many through joinSQLException:没有这样的列有很多通过连接
【发布时间】:2017-07-01 17:01:32
【问题描述】:

我正在尝试从我的联接表“Memberships”中选择所有管理员用户。我只需要从成员资格中选择所有用户,其中组 ID 为 x,成员角色为管理员。

@admins = User.joins(:memberships).where(["memberships.group_id ? and memberships.role ?", @group.id, "admin"])

问题不是试图查看memberships.role,而是说没有users.role 这样的东西。我如何获得这个来寻找会员角色?

SQLite3::SQLException: no such column: users.role: SELECT COUNT(*) FROM "users" INNER JOIN "memberships" ON "users"."id" = "memberships"."user_id" WHERE "memberships"."group_id" = ? AND "users"."role" = ?

架构中的成员资格表:

  create_table "memberships", force: :cascade do |t|
    t.integer  "group_id"
    t.integer  "user_id"
    t.datetime "created_at",             null: false
    t.datetime "updated_at",             null: false
    t.integer  "role",       default: 0
    t.index ["group_id", "user_id"], name: "index_memberships_on_group_id_and_user_id", unique: true
    t.index ["group_id"], name: "index_memberships_on_group_id"
    t.index ["user_id"], name: "index_memberships_on_user_id"
  end

membership.rb

class Membership < ApplicationRecord
  enum role: { member: 0, admin: 1 }

  belongs_to :user
  belongs_to :group
  validates :user_id, presence: true
  validates :group_id, presence: true
end

group.rb

class Group < ApplicationRecord
  belongs_to :creator, class_name: "User"
  has_many :memberships, dependent:   :destroy
  has_many :users, through: :memberships

user.rb

class User < ApplicationRecord
  has_many :created_groups, class_name: "Group"
  has_many :memberships, dependent:   :destroy
  has_many :groups, through: :memberships

【问题讨论】:

  • 我在您的SQL 查询中看到COUNT,但ActiveRecord 查询表明没有count。这是正确的查询吗?
  • 是的,这是来自控制器的确切查询。
  • 您的查询有问题。试试这个@admins = User.joins(:memberships).where(["memberships.group_id = ? and memberships.role = ?", @group.id, "admin"])
  • 我看到了两个查询之间的区别。不过,我仍然收到该错误。 SQLite3::SQLException: no such column: users.role: SELECT COUNT(*) FROM "users" INNER JOIN "memberships" ON "users"."id" = "memberships"."user_id" WHERE "memberships"."group_id" = ? AND "users"."role" = ?
  • 好的。我知道了。应该是@admins = User.joins(:memberships).where("memberships.group_id = ? and memberships.role = ?", @group.id, "admin")。您应该删除 []

标签: ruby-on-rails


【解决方案1】:

你试过了吗?如果你已经正确定义了 has_many 和 belongs_to 它应该可以工作,也许这是最简单的解决方案

User.memberships.where(group_id: @group.id, role: "admin")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-08
    • 2016-01-19
    • 2022-08-15
    • 1970-01-01
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    相关资源
    最近更新 更多