Я создаю приложение Rails 4.2.4, где у меня есть Единицы и Медики. Когда я редактирую каждый блок, у меня есть два места для медиков, incharge
и attendant
. Я хочу каким-то образом проверить, что и incharge_id
, и attendant_id
не совпадают. Таким образом, я не могу назначить себя как обе позиции на аппарате.Rails Проверка идентификаторов ассоциации
Вот как выглядит моя модель и форма.
unit.rb
class Unit < ActiveRecord::Base
belongs_to :attendant, :foreign_key => :attendant_id, :class_name => 'Medic'
belongs_to :incharge, :foreign_key => :incharge_id, :class_name => 'Medic'
belongs_to :unit_status
end
medic.rb
class Medic < ActiveRecord::Base
has_many :units
end
единиц/_form.html.erb
<%= form_for(@unit) do |f| %>
<%= f.label 'Attendant'%>
<%= f.collection_select(:attendant_id, Medic.order('name ASC'), :id, :name, {}) %>
<%= f.label 'In Charge'%>
<%= f.collection_select(:incharge_id, Medic.order('name ASC'), :id, :name, {}) %>
<%= f.label 'Unit Status'%>
<%= f.collection_select(:unit_status_id, UnitStatus.order("status ASC"), :id, :status, {})%>
<%= f.submit "Update" %>
<% end %>
Таким образом, в целом если я отредактирую блок, и я случайно присвою устройству id
«1», я хочу сделать ошибку и дать какое-то сообщение: «Невозможно назначить одного и того же медика на обе позиции». Что-то вроде того.
Единственное, что я могу думать, это как-то фильтровать Params в контроллере говоря, если PARAMS из attendant_id
и incharge_id
которые являются == перенаправить к edit_unit_path и отображать флэш-сообщение, «Вы не можете назначить тот же медик на обе позиции ».
Кажется, было бы лучше сделать валидации на стороне модели вместо наложения логики в контроллере, но я не уверен, как одновременно проверять два разных столбца на уникальность.
В дополнение к проверке на стороне сервера было бы хорошим UX запретить выбранным медикам появляться в другом поле медикаментов, например, динамически заполнять выпадающие списки. –
@DaveNewton спасибо за подсказку, в идеале это моя цель с некоторыми coffeescript/JS, но я просто пытался сначала выполнить проверку на стороне сервера. :) – nulltek