RAB嵌套在HABTM上的表单:如何防止重复输入?

bla*_*0ne 1 forms validation activerecord ruby-on-rails-3

我有一个简单的应用程序,在数据库和"多对多"关系中有3个表.

# Model Employee
class Employee < ActiveRecord::Base
   has_and_belongs_to_many :phonenumbers
   accepts_nested_attributes_for :phonenumbers, :allow_destroy => true
   attr_accessible :last_name, :first_name, :middle_name, :phonenumbers_attributes
end

# Model Phonenumber
class Phonenumber < ActiveRecord::Base
  has_and_belongs_to_many :employees
  attr_accessible :number
  accepts_nested_attributes_for :employees
end
Run Code Online (Sandbox Code Playgroud)

我有'employees_phonenumbers'连接表与'employee_id'和'phonenumber_id'列.

# View
<%= form_for @employee, :url => { :action => :create } do |f| %>

<%= f.label "Last name"   %>
<%= f.text_field :last_name   %>

<%= f.label "First name"   %>
<%= f.text_field :first_name  %>

<%= f.label "Middle name"   %>
<%= f.text_field :middle_name %>

<%= f.fields_for :phonenumbers do |phonenumber| %>
    <%= phonenumber.label "Phone number" %>
    <%= phonenumber.telephone_field :number %>
<% end %>

<%= f.submit "Create" %>
<% end %>

# Controller
def create
  @employee = Employee.new(params[:employee])
  @employee.save ? (redirect_to :action => :index) : (render "new")
end
Run Code Online (Sandbox Code Playgroud)

现在,如果我创建一个用户:电话号码为"555"的"John",就可以了.

但是,如果我想创建一个具有相同电话号码'555'的用户'Larry',则数据库中会有一个'555'条目.

我该如何防止这种情况?

更新:我的逻辑是:如果有数字'555',那么不要创建一个新的,使用现有的.如果没有这样的数字,则创建一个新数字并使用它.

Mun*_*sim 5

在employee.rb中:

before_save :get_phonenumbers


  def get_phonenumbers
    self.phonenumbers = self.phonenumbers.collect do |phonenumber|
      Phonenumber.find_or_create_by_number(phonenumber.number)
    end
  end
Run Code Online (Sandbox Code Playgroud)

我发现它的工作原理