Это может быть неправильный путь для этого, и я очень открыт для альтернатив.Пропустить has_many: через создание модели без изменений
У меня есть следующие модели, где Users
может иметь много Positions
:
class User < ApplicationRecord
has_many :user_positions
has_many :positions, through: :user_positions
accepts_nested_attributes_for :user_positions,
reject_if: :all_blank
end
class UserPosition < ApplicationRecord
belongs_to :user
belongs_to :position
end
class Position < ApplicationRecord
end
На моей форме редактирования пользователя, я хотел бы, чтобы позволить User
«s текущего положения будет обновляться. Я делаю это следующим образом:
<%= form_for @user do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
<%= f.fields_for :user_positions, @user.user_positions.order(created_at: :desc).first do |ff| %>
<%= ff.hidden_field :user_id, value: @user.id %>
<%= ff.collection_select :position_id, Position.all, :id, :label %>
<% end %>
<%= f.submit "Update User" %>
<% end %>
Проблема Я бегу в том, что новый экземпляр UserPosition
создается каждый раз, когда я представить форму, даже если Position
, выбранная не изменилась. Это приводит к кучке повторяющихся записей в таблице соединений, когда я действительно забочусь только о «рекламных акциях» или «понижениях», когда значение position_id
изменилось.
Я не хочу добавлять пользовательский валидатор, чтобы запретить создание, потому что я все еще хочу, чтобы форма могла отправлять с неизменным положением. Примером этого является то, что я хочу изменить только имя User
.
Любые советы о том, как бороться с этим прецедентом?