2012-06-28 1 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 вы можете проверить, соблюдены ли определенные критерии, но я хочу, чтобы он всегда проверялся, поэтому это не то решение, которое я ищу.

Спасибо.

BTW сообщите мне, если структура модели выглядит высмеивающейся, или если я сделал что-то ясно против конвенции rails.

ответ

0

Против и метод в точности эквивалентны с точки зрения проверки. Тем не менее, вы, вероятно, ищете что-то вроде этого:

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/if, чтобы вызвать ошибку: ' ' –

+0

У меня на самом деле есть это в коде, прокрутите его прямо, чтобы увидеть его. :) – Veraticus

+0

Doh! Итак, вы делаете, извините за это = D –

Смежные вопросы