2011-07-20 74 views
0

我有以下型號:validates_uniqueness_of場範圍限定於HAS_ONE關係

class Section < ActiveRecord::Base 
    belongs_to :course               
    has_one :term, :through => :course 
end 

class Course < ActiveRecord::Base 
    belongs_to :term 
    has_many :sections 
end 

class Term < ActiveRecord::Base 
    has_many :courses 
    has_many :sections, :through => :courses 
end 

我希望能夠做到在我Section模型以下(call_numberSection領域):

validates_uniqueness_of :call_number, :scope => :term_id 

這顯然不起作用,因爲Section沒有term_id,所以我怎麼能限制範圍到一個關係的模型?

我試圖創建Section定製驗證無果(當我創建一個新的Section與錯誤不工作「的零未定義的方法‘部分’:NilClass」):

def validate_call_number 
    if self.term.sections.all(:conditions => ["call_number = ? AND sections.id <> ?", self.call_number, self.id]).count > 0 
    self.errors[:base] << "Call number exists for term" 
    false 
    end 
    true 
end 

非常感謝!

回答

0

假設您的驗證碼是正確的,爲什麼不簡單地添加一個支票存在的檢查?

def validate_call_number 
    return true if self.term.nil? # add this line 
    if self.term.sections.all(:conditions => ["call_number = ? AND sections.id <> ?", self.call_number, self.id]).count > 0 
    self.errors[:base] << "Call number exists for term" 
    false 
    end 
    true 
end 
+0

'term'似乎總是'nil'之前保存。我認爲這是因爲'term'只能通過關係'section'來使用。 – zsalzbank

+0

@zsalzbank它應該取決於您是否爲該部分分配了「課程」。如果您已將「課程」分配給「部分」,並且「課程」具有「術語」,則即使該部分實例是新記錄,self.term也不應爲零。 – Fabio