2012-06-28 168 views
1

所以我在寫有如下型號和關聯的應用程序:驗證祖父母:兩個父母有同一個父母嗎?

class Company < ActiveRecord::Base 
    has_many :customers, :dependent => :destroy 
    has_many :goals, :dependent => :destroy 
end 

class Customer < ActiveRecord::Base 
    belongs_to :company 
    has_many :tasks 
    has_many :goals, through: :tasks 
end 

class Goal < ActiveRecord::Base 
    has_many :tasks, :dependent => :destroy 
    belongs_to :company 
    has_many :customers, through: :tasks 
end 

class Task < ActiveRecord::Base 
    belongs_to :goal 
    belongs_to :customer 
end 

現在看來,一個的form_for新任務已經有目標或客戶選擇,另協會選擇是基於過濾集在另一個模型上。理論上,用戶不可能在兩個不同的公司下創建任務,即@ task.goal.company == @ task.customer.company。

但是,驗證來確認只有一個祖父母是好的做法。我理解使用Proc.new可以驗證是否符合某個標準,但我希望它始終驗證,因此這不是我正在尋找的解決方案。

謝謝。

順便說一句,讓我知道,如果模型結構看起來嘲笑或如果我已經做了明確的反對軌道約定。

回答

0

proc.new和一個方法在驗證方面是完全等價的。也就是說,你可能正在尋找像這樣的東西:

class Task < ActiveRecord::Base 
    belongs_to :goal 
    belongs_to :customer 

    validate :companies_match 

    private 

    def companies_match 
    self.errors.add(:base, "Goal company and customer company must be equivalent") unless goal.company == customer.company 
    end 
end 
+0

這很好地工作。爲了防止別人來尋找答案,你顯然需要一個if /除非調用錯誤: '' –

+0

我其實已經在代碼中,向右滾動以查看它。 :) – Veraticus

+0

Doh!所以你做了,對不起= D –