Create a gist now

Instantly share code, notes, and snippets.

This gist shows how to make a polymorphic association for users in rails which have an specific role, such as Member, Admin...works with devise
##Userable
module Userable
def self.included(base)
base.has_one :user, :as => :userable, :dependent => :destroy, :autosave => true
base.validate :user_must_be_valid
base.alias_method_chain :user, :autobuild
base.extend ClassMethods
base.define_user_accessors
end
def user_with_autobuild
user_without_autobuild || build_user
end
def method_missing(meth, *args, &blk)
user.send(meth, *args, &blk)
rescue NoMethodError
super
end
protected
def user_must_be_valid
unless user.valid?
user.errors.each do |attr, message|
errors.add(attr, message)
end
end
end
module ClassMethods
def define_user_accessors
all_attributes = User.columns.map(&:name)
all_attributes << "password"
all_attributes << "password_confirmation"
ignored_attributes = ["created_at", "updated_at", "userable_type", "encrypted_password", "id", "userable_id"]
attributes_to_delegate = all_attributes - ignored_attributes
attributes_to_delegate.each do |attrib|
class_eval <<-RUBY
def #{attrib}
user.#{attrib}
end
def #{attrib}=(value)
self.user.#{attrib} = value
end
def #{attrib}?
self.user.#{attrib}?
end
RUBY
end
end
end
end
##Act as user
class ActiveRecord::Base
def self.acts_as_user
include Userable
end
end
##User model
belongs_to :userable, polymorphic: true
##Polymorphic model
acts_as_user
@macarthy
macarthy commented Jan 4, 2016

This was helpful.
What did you do for the signup, signin etc. ?? How do you configuring the routes for the models?

Thanks

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment