PG :: UndefinedColumn:错误:关系“用户”的列“选择”不存在第1行:更新

时间:2019-03-20 18:11:01

标签: ruby-on-rails postgresql routing

当前收到错误消息:

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上进行选择的路线,这可能是我的问题吗?

routes.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中添加了unavailableschedules_controller方法。

available方法使用户说它们可用于该计划项目。 unavailable将撤消此操作并破坏记录,因为我不需要保留该信息。

2 个答案:

答案 0 :(得分:0)

在将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])

答案 1 :(得分:0)

update_all更新用户表中的字段。可用性不是字段而是关系(可用性表中的行数组)。 如果我理解正确,您想从日程表中删除可用性/用户,对吗?而您可以通过选择要删除的用户来做到这一点?或取消选择它们? 如果这是firs选项,那么您可能想做的就是

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