Запросите администраторов из таблицы групп пользователей в Rails - PullRequest
0 голосов
/ 10 марта 2019

Я пытаюсь создать страницу редактирования для группы пользователей, которую могут видеть только администраторы.Я создал 3 модели:

group.rb:

class Group < ApplicationRecord
...
  has_many :user_groups, dependent: :destroy
  has_many :users, through: :user_groups
...
end

user.rb:

class User < ApplicationRecord
...
  has_many :user_groups, dependent: :destroy
  has_many :groups, through: :user_groups
...
end

usergroups.rb:

class UserGroup < ApplicationRecord
  belongs_to :user
  belongs_to :group

  validates_presence_of :user_id
  validates_presence_of :group_id
end

Модель групп пользователей - это та, которая включает логическое поле «true», когда пользователь является администратором.Вот schema.rb для упомянутых моделей:

  create_table "groups", force: :cascade do |t|
    t.string "name"
    t.text "description"
    t.bigint "user_id"
    t.integer "type"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "slug"
    t.index ["slug"], name: "index_groups_on_slug", unique: true
    t.index ["type"], name: "index_groups_on_type"
    t.index ["user_id"], name: "index_groups_on_user_id"
  end

    create_table "user_groups", force: :cascade do |t|
    t.bigint "user_id"
    t.bigint "group_id"
    t.boolean "is_admin"
    t.boolean "is_owner"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["group_id"], name: "index_user_groups_on_group_id"
    t.index ["user_id"], name: "index_user_groups_on_user_id"
  end

    create_table "users", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "username", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer "sign_in_count", default: 0, null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string "current_sign_in_ip"
    t.string "last_sign_in_ip"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
    t.index ["username"], name: "index_users_on_username", unique: true
  end

Мой вопрос:

Как настроить администраторов, используя поле "is_admin" в usergroups.rb? Я пытался что-то вроде "group.usergroups.is_admin?"но никаких результатов с этим.

Для устранения сомнений авторизация будет выполняться 'pundit', но у меня нет ясности в том, как охватить администраторов.Я использую рельсы 5.2 и ruby ​​2.6.

Любой совет?Спасибо!

Ответы [ 2 ]

0 голосов
/ 10 марта 2019

Может быть, это может помочь или привести к лучшему решению для вас.

Когда у вас есть экземпляр Group, скажем, @group, вы можете запросить , присоединяясь к таблицам :

admins = @group.user_groups.joins(:user).where("user_groups.is_admin = true")

Тогда вы сможете сделать что-то вроде:

admins.each { |admin| p admin.user.name }


Вы можете определить в вашей модели:
class Group < ApplicationRecord
  has_many :user_groups, dependent: :destroy
  has_many :users, through: :user_groups

  def admins
    user_groups.joins(:user).where("user_groups.is_admin = true")
  end
end

Для того, чтобы позвонить просто @group.admins


Другой вариант в чистом Ruby, учитывая, что @group:
admins = group.user_groups.select { |ug| ug.is_admin }
0 голосов
/ 10 марта 2019

Я бы пошел с чем-то вроде этого:

class GroupPolicy
  def update?
    UserGroup.where(user_id: user.id, group_id: group.id, is_admin: true).exists?
  end
end

, который можно использовать в методе обновления контроллера, например

authorize @group

или в виде - например, для отображения редактированияссылки - вот так

<% if policy(@group).update? %>
  <%= link_to "Edit group", edit_group_path(@group) %>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...