当前收到错误消息:
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
中添加了unavailable
和schedules_controller
方法。
available
方法使用户说它们可用于该计划项目。 unavailable
将撤消此操作并破坏记录,因为我不需要保留该信息。
答案 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