Rails ActiveRecord - пользователи ведут себя как команда после миграции - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть таблица пользователей и команд.В таблице пользователей есть столбец с именем team_id.Но теперь цель состоит в том, чтобы позволить пользователям иметь несколько команд.

Итак, я создал таблицу user_teams, используя такие миграции:

class CreateUserteams < ActiveRecord::Migration[5.0]
  def change
    create_table :user_teams do |t|
      t.integer :user_id
      t.integer :team_id

      t.timestamps
    end
  end
end

И мой код выглядит следующим образом:

models / user.rb

class User < ApplicationRecord

#belongs_to :team

# should now have multiple teams
has_many :user_teams
has_many :teams, through: :user_teams

models / team.rb

class Team < ApplicationRecord

has_many :members, foreign_key: "team_id", class_name: "User"

has_many :user_teams
has_many :users, through: :user_teams

models / user_teams.rb(новый файл)

class UserTeam < ApplicationRecord
  belongs_to :user
  belongs_to :team
end

(Это нормально работает) Чтобы пригласить пользователя присоединиться к команде, я отправляю ему приглашение, и, если он его принимает, я добавляю его в новую таблицу users_team с помощью:

controllers / team_invites_controller.br

    def accept
    user = @team_invite.user
    @team_invite.update(status: TeamInvite.statuses[:accepted])
    user.team_id = @team_invite.team_id
    user.company_id = @team_invite.team.company_id
    user.teams << Team.find(user.team_id)
    user.save(:validate => false)


    respond_to do |format|
      if user.shadow?
        format.html {
          redirect_to new_user_registration_path({
            :email => user.email,
            :role => user.main_role,
          })
        }
      else
        format.html { redirect_to dashboard_root_path, notice: 'Invite accepted' }
      end
      format.json { head :no_content }
    end
  end

Проблема в том, что теперь «пользователь» каким-то образом стал командой, а не пользователем, и он сломал весь код, используя"user.something".Также из-за этого я не могу получить доступ к методам пользователя, потому что «пользователь» больше не пользователь, а команда.

Например, сейчас:

<% if user.photo.exists? %>

дает:

неопределенный метод `photo 'для команды: 0x00007f381dea4708

Или:

<% if current_user.teams.members.count > 1 %>

дает:

неопределенный метод` members' для команды:: ActiveRecord_Associations_CollectionProxy: 0x00007f3845954eb0 Вы имели в виду?участник?

Почему users.something теперь ведет себя как команда?Я уже сделал повторные миграции и получил ту же ошибку.Есть идеи, как это произошло и как это исправить?Как правильно получить доступ к свойствам и методам пользователей?Спасибо

РЕДАКТИРОВАТЬ Вкл.

<% if user.photo.exists? %>

он предназначен для отображения изображения другого пользователя и выдает неопределенную ошибку метода "photo" метода.Но если я использую (хотя я не хочу)

<% if current_user.photo.exists? %>

Это работает.Как получилось?

1 Ответ

0 голосов
/ 20 декабря 2018

У ваших пользователей несколько teams, и, таким образом, current_user.teams больше не является Team, это прокси-сервер коллекции, для доступа к отдельным командам оттуда, в зависимости от вашей логики, которую вы можете использовать:

<% if current_user.teams.any?{|team| team.members.count > 1 } %>

(обратите внимание, что этот код может быть неэффективным, если команд много)

...