2015-12-13 2 views
1

Я создаю приложение 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 и отображать флэш-сообщение, «Вы не можете назначить тот же медик на обе позиции ».

Кажется, было бы лучше сделать валидации на стороне модели вместо наложения логики в контроллере, но я не уверен, как одновременно проверять два разных столбца на уникальность.

ответ

0

Я придумал это на модели Unit.

validate :attendant_and_incharge 

def attendant_and_incharge 
    errors.add(:attendant_id, "can't be the same as the incharge") if attendant_id == incharge_id 
end 

Это не позволит мне сохранить один и тот же идентификатор модели устройства для attendant_id и incharge_id. Он терпит неудачу и направляет на unit_path. Просто нужно добавить некоторые условные условия в контроллер для перенаправления на путь редактирования при сбое. (ThumbsUp)

+0

В дополнение к проверке на стороне сервера было бы хорошим UX запретить выбранным медикам появляться в другом поле медикаментов, например, динамически заполнять выпадающие списки. –

+0

@DaveNewton спасибо за подсказку, в идеале это моя цель с некоторыми coffeescript/JS, но я просто пытался сначала выполнить проверку на стороне сервера. :) – nulltek

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