我有以下幾點:Rails validates_uniqueness_of導致了指數級的查詢。你如何優化?
class List < ActiveRecord::Base
accepts_nested_attributes_for :list_options, :reject_if => lambda { |a| a[:title].blank? }, :allow_destroy => true
validates_associated :list_options
class ListOption < ActiveRecord::Base
validates_uniqueness_of :title, :scope => [:list_id]
當沿着與可以說在控制器10列表項創建一個新的列表:
@list = List.create(params[:list].merge(:user_id => current_user.id)
數據庫中獲取單獨查詢,以檢查每個listOption,看是否它是獨一無二的。有沒有一種方法來優化以上所以數據庫不會一直打到檢查每個項目?
謝謝
看起來像n個查詢,而不是x^n?把驗證拿走並放入一個唯一的組合索引,然後在拋出異常時處理異常如何? – jimworm
有趣的問題,有趣的建議。我想知道在你的列表中has_many:list_options,:uniq => true'在這種情況下會如何表現?或者,也許你可以刪除validates_associated,做一個list_options.collect&:title並自己手工檢查數據庫,比如'ListOption.where(list_id:id,title:list_options.collect&:title).exists?'。不知道,爲什麼不呢? –
哦,但如何建立一個複合索引,如果列表的ID尚未設置(List.new)?也許在after_save中擠壓這個? –