So I have this question:

Suppose I have these 3 models:

class Company < ActiveRecord::Base
  has_many :departments
  has_many :employees
end

class Department < ActiveRecord::Base
  has_many :employees
  belongs_to :company
end

class Employee < ActiveRecord::Base
  belongs_to :company
  belongs_to :department
end

Furthermore, suppose the domain I am modeling requires that I support
the existence of employees that do not belong to any department
(otherwise I would declare that Company has_many :employees, :through
=> :departments instead).

As I am working with the Department model, I am thinking that it is
conceivable that a mistake can be made in the code to allow an
employee from a company to be incorrectly assigned to a department in
another company.  Hence, it might be a good idea to write some custom
validation to ensure an employee and a department belong to the same
company before they associated together.

Since associate a department and an employee together in one of two
ways, I would need validation logic in both models.  So I am thinking
it would involve something like:

1. In the Department model

def validate
  self.errors.add(:employees, "must all belong to same company") if
self.employees.collect { |e| e.company_id }.uniq.length > 1
end

2 In the Employee model:

def validate
  self.errors.add(:department, "must belong to the same company") if
self.department && self.department != self.company
end

However, having to write two separate methods to support a single
business rule feels not so DRY or elegant.  Is there a better way to
go?

Thanks!

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to rubyonrails-talk@googlegroups.com
To unsubscribe from this group, send email to 
rubyonrails-talk+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to