[英]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.