簡體   English   中英

在Rails中保存模型中的記錄之前,執行檢查重復項的功能

[英]Performing a function to check for duplicates before saving the record in the model in Rails

這就是我的模型中的內容。 我想檢查重復記錄,我不能只為字段使用唯一索引,因為每個作業的聯系人是唯一的)我無法使用以下代碼執行此操作。 我做錯了嗎? 任何幫助表示贊賞。 謝謝!

before_save :check_for_duplicates?

def check_for_duplicates?
  JobsPeople.find(:all, :conditions => ["job_id = ? and contact_id = ?", self.job_id, self.contact_id])
end

我相信這應該做你想要的

class JobsPeople
  validates_uniqueness_of :contact_id, scope: :job_id
end

回調除了運行您告訴他們運行的代碼之外,不會做任何事情。 如果要阻止執行某些操作,則有兩個選項,請使用驗證或引發錯誤。

在您當前的代碼中,您可以檢查您運行的查詢是否返回任何內容,然后如果出現則引發錯誤。 該錯誤將冒泡到包裝保存並觸發回滾的事務,然后將錯誤傳播到您可以根據需要處理它的代碼中。

before_save :check_for_duplicates?

def check_for_duplicates?
  if JobsPeople.find(:all, :conditions => ["job_id = ? and contact_id = ?", self.job_id, self.contact_id]).any?
    raise 'some error'
  end
end

雖然已經有一個內置的唯一性驗證器來處理這種情況

validates :job_id, :uniquness => {:scope => :contact_id, :message => 'must be unique per contact}

當然,由於存在潛在的競爭條件,因此仍應使用數據庫中的復合唯一索引進行備份,其可能性很大程度上取決於應用程序的行為。

# in a migration

add_index :table_name, [:job_id, :contact_id], :unique => true, :name => 'index_job_id_and_contact_id_on_table_name'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM