2016-07-13 6 views
0

Это может быть неправильный путь для этого, и я очень открыт для альтернатив.Пропустить 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.

Любые советы о том, как бороться с этим прецедентом?

ответ

0

Оказывается, вы можете использовать любой метод в качестве аргумента Symbol до accepts_nested_attributes_forreject_if.

Я обновил свой User модель следующим образом, и теперь поведение именно то, что я хочу:

class User < ApplicationRecord 
    has_many :user_positions 
    has_many :positions, through: :user_positions 

    accepts_nested_attributes_for :user_positions, 
    reject_if: :same_as_previous_position 

    def same_as_previous_position(attributes) 
    if self.user_positions.empty? 
     return false 
    end 

    Position.find(attributes[:position_id]) == self.user_positions.order(created_at: :desc).first.position 
    end 
end 

 Смежные вопросы

  • Нет связанных вопросов^_^