2013-06-06 50 views
1

我有簡單的應用程序與數據庫中的3個表和'多對多'的關係。HABTM上的Rails嵌套窗體:如何防止重複輸入?

# 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 

我有'employee_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 

現在,如果我創建了一個用戶:'約翰'與電話號碼'555',那沒關係。

但是,如果我想創建一個具有相同電話號碼「555」的用戶'拉里',那麼在數據庫中有一個'555'條目的共享條目。

我該如何預防?

更新:我的邏輯是:如果有數字'555',那麼不要創建一個新的,使用現有的。如果沒有這樣的號碼,則創建一個新號碼並使用它。

回答

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 

我已經找到了工作

+0

非常感謝。 – blackst0ne

4

您可以使用rails驗證來檢查記錄的唯一性。

在模型中phonenumber.rb放下面一行,

validates_uniqueness_of :column_name 

它將確保Phonenumber來將只有唯一PHONE_NUMBERS。

現在在控制器中,您可以從params中檢查phone_number,如果number已經存在,那麼我們將刪除嵌套屬性fron params,以便Phonenumber記錄不會生成。

def create 
    @phone_number = Phonenumber.where(:number=>params[:employee][:phonenumber][:number]) 
    if @phone_number.any? 
     params[:employee].delete(:phonenumber) 
     @employee = Employee.new(params[:employee]) 
     if @employee.save? 
     @employee.phonenumber = @phone_number.first 
     redirect_to :action => :index 
     else 
     render "new" 
     end 
    else 
    @employee = Employee.new(params[:employee]) 
    @employee.save ? (redirect_to :action => :index) : (render "new") 
    end 
end 
+0

我的邏輯是: 如果有數字 '555',然後不創建一個新的,使用現有的。 如果沒有這樣的號碼,則創建一個新號碼並使用它。 – blackst0ne

+0

您可以在創建記錄之前檢查電話號碼的存在。爲此,您可以檢查telephone_number值的形式參數。使用binding.pry檢查parmas值,並在params中做相應的修改。但現在,讓我先檢查,以便我給你代碼。 – bunty

+0

我編輯了答案。請檢查它,並讓我知道是否有任何錯誤發生。 – bunty