Rails 5:找到所有属于Companies的用户,属于current_user

时间:2016-09-24 06:01:21

标签: ruby-on-rails ruby arel

在我的应用中,用户可以拥有多家公司,反之亦然。在帐户表中,存储用户的ID和公司的ID。 我想找到所有属于公司的用户,这些用户属于current_user。我们假设current_user就像那些公司的主用户(不是管理员,因为那是系统管理员)。 我该怎么做呢?我的猜测是用Arel做的,但那么它应该如何看待Model,Controller,View?非常感谢任何帮助。我在Rails 5上。

模型/ user.rb

class User < ApplicationRecord
has_many :accounts, dependent: :destroy
has_many :companies, through: :accounts

模型/ account.rb

class Account < ApplicationRecord
belongs_to :company
belongs_to :user
accepts_nested_attributes_for :company, :user

模型/ company.rb

class Company < ApplicationRecord
has_many :accounts, dependent: :destroy
has_many :users, through: :accounts
accepts_nested_attributes_for :accounts, :users

我的schema.rb看起来像这样:

create_table "accounts", force: :cascade do |t|
t.integer  "company_id"
t.integer  "user_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["company_id"], name: "index_accounts_on_company_id"
t.index ["user_id"], name: "index_accounts_on_user_id"
end

  create_table "companies", force: :cascade do |t|
t.string   "name"
t.string   "legal_name"
t.string   "reg_number"
t.string   "address"
t.string   "bank_acc"
t.string   "description"
t.string   "website"
t.datetime "created_at",              null: false
t.datetime "updated_at",              null: false
t.integer  "role",        default: 0
t.integer  "currency",    default: 0
end

  create_table "users", force: :cascade do |t|
t.string   "name"
t.string   "email"
t.datetime "created_at",                      null: false
t.datetime "updated_at",                      null: false
t.string   "password_digest"
t.string   "remember_digest"
t.boolean  "admin",           default: false
t.index ["email"], name: "index_users_on_email", unique: true
end

1 个答案:

答案 0 :(得分:1)

您可以找到当前用户的公司,以及属于这些公司的热心用户

@companies = current_user.companies.includes(:users)

要列出所有用户(可能在视图中),请循询@companies及其所有users

@companies.each do |company|
  company.users.each do |user|
    puts user.name
  end
end

或使用map / collect将它们分配给变量。

@users = @companies.map(&:users).flatten