2015-12-13 77 views
1

我正在構建一個Rails 4.2.4應用程序,其中有Units和Medics。當我編輯每個單位時,我有兩個醫療點,inchargeattendant。我想要一些方法來驗證incharge_idattendant_id是不一樣的。這樣我就不能將自己指定爲單位上的兩個職位。聯盟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 %> 

因此,在總結如果我編輯了一個單位,並且我不小心將「1」的id分配給單位,我想錯誤並給出某種信息,「不能將同一個醫生分配到兩個位置」。類似的東西。

我能想到的唯一的事情,就是以某種方式篩選控制器的PARAMS說如果attendant_idincharge_id的PARAMS的是==然後重定向到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 

這不會讓我相同的ID保存到attendant_id和incharge_id的示範單位。它靜靜地失敗並且指向units_path。只需要在控制器中添加一些條件以在失敗時重定向到編輯路徑。 (ThumbsUp)

+0

除了服務器端驗證之外,如果不允許所選醫療服務器出現在其他軍醫領域,例如,動態填充下拉菜單,那麼UX會是一個很好的選擇。 –

+0

@DaveNewton感謝您的提示,理想情況下,這是我的一些coffeescript/JS的目標,但我只是想首先完成服務器端驗證。 :) – nulltek