Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Aug 21st, 2012  |  syntax: None  |  size: 1.49 KB  |  hits: 15  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. class User < ActiveRecord::Base
  2.   attr_accessible :name
  3.  
  4.   has_many :admin_memberships, class_name: "Membership", conditions: {role: 'admin'}
  5.   has_many :editor_memberships, class_name: "Membership", conditions: {role: 'editor'}
  6.  
  7.   def admin?
  8.     admin_memberships.exists?
  9.   end
  10.  
  11.   def editor?
  12.     editor_memberships.exists?
  13.   end
  14. end
  15.  
  16. class Group < ActiveRecord::Base
  17.   attr_accessible :name
  18.  
  19.   has_many :admin_memberships, class_name: "Membership", conditions: {role: "admin"}
  20.   has_many :editor_memberships, class_name: "Membership", conditions: {role: "editor"}
  21.   has_many :admins, through: :admin_memberships, source: :user
  22.   has_many :editors, through: :editor_memberships, source: :user
  23. end
  24.  
  25. class Membership < ActiveRecord::Base
  26.   attr_accessible :role
  27.  
  28.   belongs_to :user
  29.   belongs_to :group
  30. end
  31.  
  32. sam = User.new name: "Sam"
  33. # => #<User id: 1, name: "Sam", created_at: "2012-04-05 11:45:54", updated_at: "2012-04-05 11:45:54">
  34. rainbows = Group.new name: "Rainbows"
  35. # => #<Group id: 1, name: "Rainbows", created_at: "2012-04-05 11:46:06", updated_at: "2012-04-05 11:46:06">
  36. rainbows.admins << sam
  37. # => [#<User id: 1, name: "Sam", created_at: "2012-04-05 11:45:54", updated_at: "2012-04-05 11:45:54">]
  38. rainbows.admin_memberships
  39. # => [#<Membership id: 2, user_id: 1, group_id: 1, role: "admin", created_at: "2012-04-05 11:48:58", updated_at: "2012-04-05 11:48:58">]
  40. user.admin?
  41. # Membership Exists (0.3ms)  SELECT 1 FROM "memberships" WHERE "memberships"."user_id" = 1 AND "memberships"."role" = 'admin' LIMIT 1
  42. # => true