Rails验证关联ID

时间:2015-12-13 18:09:02

标签: validation ruby-on-rails-4 activerecord

我正在构建一个Rails 4.2.4应用程序,我有单位和医生。当我编辑每个单元时,我有两个医疗点,inchargeattendant。我想要一些方法来验证incharge_idattendant_id是不一样的。这样我就无法将自己指定为单位的两个位置。

以下是我的模型和表单视图。

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&#34; 1&#34;对于单位,我想错误并给出某种消息,&#34;不能将同一个医生分配到两个位置&#34;。这样的事情。

我唯一能想到的是,以某种方式过滤控制器中的参数,说明attendant_idincharge_id的参数是否= =然后重定向到edit_unit_path并显示一条flash消息,&#34;你不能将同一个医生分配到两个位置&#34;。

似乎最好在模型端进行验证而不是在控制器中填充逻辑,但我不确定如何同时验证两个不同列的唯一性。

1 个答案:

答案 0 :(得分: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)