Validate has_many relationship with conditions ?

I need to validate that I have at least one relationship with a certain
condition. My code so far:

class User < ActiveRecord::Base
  belongs_to :user_type
end

class UserType < ActiveRecord::Base
  has_many :users
  has_many :admins, :source => :users, :conditions => "user_type_id = 1"
end

How do I validate that I have at least one admin when updating any user?

You can overwrite validate_on_update in your User model.

http://api.rubyonrails.org/classes/ActiveRecord/Validations.html#M001044

I'm not sure if this is exactly what you're looking to do, but it
might look something like:
def validate_on_update
    errors.add("User Type", "has no admins") if UserType.admins.count
== 0
end

*warning, not tested*

Thanks, I got pretty close with this suggestion..

turns out as I build this out more, i actually have users, groups, and
roles (on these groups), with role_types (1 is admin). in my roles
controller, I have actions which add/remove roles from a given group
(which correctly triggers my custom before_destroy method). However, I
can't seem to find how to display the errors from "before_destroy" upon
the redirect back to the group page. So far, I've been using
"error_messages_for :groups", similar to on my forms. I'm guessing
their is a problem displaying the errors generated by a "Role" in the
"Group" pages. suggestions?

class User < ActiveRecord::Base
  has_many :roles
  has_many :groups, :through => :roles
end

class Group < ActiveRecord::Base
  has_many :roles
  has_many :users, :through => :roles
  has_many :owners, :through => :roles, :source => :user, :conditions =>
"role_type_id = 1"
end

class RoleType < ActiveRecord::Base
  has_many :roles
end

class Role < ActiveRecord::Base
  belongs_to :user
  belongs_to :group
  belongs_to :role_type

  def before_destroy
    if (role_type_id.to_i == 1 && Group.find(group_id.to_i).owners.count
<= 1)
      errors.add(:group, "Groups require at least one owner")
      false
    end
  end
end

class RolesController < ApplicationController
  def remove (group_id = params[:group_id], role_type_id =
params[:role_type_id], user_id = @current_user.id)
    conditions = {:group_id => group_id, :role_type_id => role_type_id,
:user_id => user_id }
    Role.destroy_all(conditions)
    redirect_to :controller => :groups, :action => "show", :id =>
group_id
  end
end

gsterndale wrote: