Skip to content

Instantly share code, notes, and snippets.

@orthodoc
Forked from kurenn/gist:4421177
Created February 1, 2014 06:22
Show Gist options
  • Save orthodoc/8748714 to your computer and use it in GitHub Desktop.
Save orthodoc/8748714 to your computer and use it in GitHub Desktop.
##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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment