Как настроить ассоциации has_many / assign_to, чтобы разрешалась только одна комбинация? - PullRequest
0 голосов
/ 16 ноября 2011

У меня три таблицы, соискатели, пользователи и рейтинги. Основная идея заключается в том, что каждому кандидату присваивается рейтинг любым числом пользователей. Эта часть у меня работает без проблем. Однако, если пользователь идет редактировать свою оценку (которая включает в себя оценку), форма добавляет вторую оценку. Мне нужно что-то изменить, чтобы каждый пользователь мог назначить только одну оценку данному кандидату.

class Applicant < ActiveRecord::Base
  has_many  :ratings
  accepts_nested_attributes_for :ratings, :allow_destroy => true

class User < ActiveRecord::Base  
  has_many  :ratings

Таблица рейтингов содержит только идентификатор заявителя, идентификатор пользователя и оценку.

class Rating < ActiveRecord::Base
  belongs_to  :user
  belongs_to  :applicant
  validates_uniqueness_of :applicant_id, :scope => :user_id

Проверка рейтинга гарантирует, что второй рейтинг не принят, но мне нужно изменить ассоциации (или форму) так, чтобы второй вариант оценки никогда не появлялся.

Форма моей заявки:

<%= f.fields_for :ratings do |builder| %>
    <%= builder.collection_select :score, Rating::SCORES, :to_s, :humanize %> 
    <%= builder.hidden_field :user_id, :value => current_user.id %>
    <%= builder.hidden_field :applicant_id, :value => @applicant.id %>
<% end %>

Как мне указать (в модели кандидата, я думаю, так как это форма, которую я редактирую), что комбинация Applicant_id, user_id в таблице рейтингов должна быть уникальной?

1 Ответ

0 голосов
/ 18 ноября 2011

В итоге я начал работать, выполнив следующее.

В моем контроллере-заявителе я изменил способ редактирования на:

  def edit
    @applicant = Applicant.find(params[:id])
    @my_rating = Rating.where(:applicant_id => params[:id]).where(:user_id => current_user.id)
    if @my_rating.empty?
      @my_rating = @applicant.ratings.build
    end
  end

Поскольку я не могу создать область видимости с использованием current_user, я подумал, что это сработает здесь. Затем в форме я изменил поля вложенных атрибутов на:

<%= f.fields_for :ratings, @my_rating do |builder| %>
    <%= builder.collection_select :score, Rating::SCORES, :to_s, :humanize %> 
    <% if builder.object.user_id.nil?%>
        <%= builder.hidden_field :user_id, :value => current_user.id %>
    <% end %>
<% end %>

Другим важным битом является проверка уникальности в приведенной выше модели рейтингов. Это позволило каждому пользователю иметь только один рейтинг для каждого кандидата.

Мне кажется, это работает нормально, но если у кого-то есть предложения по улучшению этого, я бы с удовольствием их услышал.

...