PG :: UndefinedColumn: ERROR: столбец "selection" отношения "users" не существует LINE 1: UPDATE - PullRequest
0 голосов
/ 20 марта 2019

В настоящее время появляется сообщение об ошибке:

PG::UndefinedColumn: ERROR: column "availability" of relation "users" does not exist LINE 1: UPDATE "users" SET "availability" = NULL WHERE "users"."id" ... ^ : UPDATE "users" SET "availability" = NULL WHERE "users"."id" IN (SELECT "users"."id" FROM "users" INNER JOIN "availabilities" ON "users"."id" = "availabilities"."user_id" WHERE "availabilities"."schedule_id" = $1)

Использование отношения has_many_through с моделями следующим образом:

Модель пользователя:

has_many :availabilities
has_many :schedules, through: :availabilities

Модель расписания:

has_many :availabilities
has_many :users, through: :availabilities

Модель доступности:

belongs_to :user
belongs_to :schedule

Я думаю, что моя проблема заключается либо в моей маршрутизации, либо в моем действии контроллера.В настоящее время у меня есть маршрут, по которому выполняется выбор schedules/:id/selection, который может быть частью моей проблемы?

rout.rb

resources :schedules do
  collection do
    put :selected
  end
  member do
    get :available, :unavailable, :selection
  end
end

schedules_controller.rb

#  Available to play method
  def available
    if logged_in?
      @schedule = Schedule.find(params[:id])
      current_user.availabilities.create(schedule: @schedule)
      redirect_to @schedule
    end
  end

#  Unavailable to play method
  def unavailable
    if logged_in?
      @schedule = Schedule.find(params[:id])
      @availability = Availability.find_by(schedule_id: @schedule.id, user_id: current_user.id)
      @availability.destroy
      redirect_to @schedule
    end
  end

def selection
  @schedule = Schedule.find(params[:id])
  @users = @schedule.users
  @users.update_all(availability: params[:user_ids])
end

и представление:

<div class="form-group row justify-content-center">
  <div class="col-md-4">
    <%= form_for(:availability, url: available_schedule_path) do |f| %>
      <% @users.each do |user| %>

        <%= f.label :user_id, class: 'checkbox inline' do %>
        <%= f.check_box 'user_id[]', value: user.id %>
          <span><%= user.name %></span>
        <% end %>
      <% end %>
  </div>
  <%= f.submit 'Set Lineup', class: 'btn btn-primary', method: :post %>
  <% end %>
</div>

Редактировать:

Добавлены available и unavailable методы в schedules_controller.

available позволяютпользователь говорит, что они доступны для этого элемента.unavailable отменяет это и уничтожает запись, так как мне не нужно хранить эту информацию.

Ответы [ 2 ]

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

update_all обновляет поле в таблице пользователей. Доступность - это не поле, а отношение (массив строк из таблицы доступности). Если я правильно понимаю, вы хотите удалить доступность / пользователей из графика, верно? а вы делаете это, выбирая каких пользователей удалять? или не выбирая их? если это первый вариант, то, что вы, вероятно, хотите сделать, это

def selection
  @schedule = Schedule.find(params[:id])
  @schedule.availabilities.where(user_id: params[:user_ids]).destroy_all
end

если ваш вариант последний, то

def selection
  @schedule = Schedule.find(params[:id])
  @schedule.availabilities.where.not(user_id: params[:user_ids]).destroy_all
end
0 голосов
/ 20 марта 2019

Когда вы используете has_many :through для отношения «многие ко многим», вы по сути создаете массив внешних ключей для каждой модели; по крайней мере, именно так Rails, кажется, относится к этому.

Это @users.update_all(availability: params[:user_ids]) должно быть:

@users.update_all(schedule_ids: params[:schedule_ids])

Каждый пользователь имеет_ множество расписаний. Каждый график имеет много пользователей. Расписание может быть обновлено как:

@schedule.update(users_ids: params[:user_ids])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...