Class: ActiveRecord::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/common_lib/active_record/base.rb

Class Method Summary collapse

Class Method Details

.acts_like_a_hash(*args) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/common_lib/active_record/base.rb', line 91

def self.acts_like_a_hash(*args)
  options = {
    :key   => :key,
    :value => :description
  }.update(args.extract_options!)

  cattr_accessor :acts_like_a_hash_options
  cattr_accessor :acts_like_a_hash_memory

  class_eval do

    self.acts_like_a_hash_options = options
    self.acts_like_a_hash_memory = {}

    validates_presence_of   options[:key], options[:value]
    validates_uniqueness_of options[:key], options[:value]
    validates_length_of     options[:key], options[:value],
      :maximum => 250, :allow_blank => true

    # Treats the class a bit like a Hash and
    # searches for a record with a matching key.
    def self.[](key)
      self.acts_like_a_hash_memory[key.to_s.downcase.to_s] ||=
        where(self.arel_table[self.acts_like_a_hash_options[:key]].matches(key)).first
    end

  end  #  class_eval do
end

.alias_attribute_with_memory(new_name, old_name) ⇒ Object

cattr_accessor here would create a class variable for ActiveRecord::Base What I want is the subclass to have one so just wait until its used the first time and create the class variable them cattr_accessor :aliased_attributes



139
140
141
142
143
144
145
146
# File 'lib/common_lib/active_record/base.rb', line 139

def self.alias_attribute_with_memory(new_name, old_name)
  unless self.class_variable_defined? '@@aliased_attributes'
    cattr_accessor :aliased_attributes
    self.aliased_attributes = {}.with_indifferent_access
  end
  self.aliased_attributes[new_name] = old_name
  alias_attribute_without_memory(new_name, old_name)
end

.aliased_attributesObject

for those classes that don’t use the feature, just add the method.



131
132
133
# File 'lib/common_lib/active_record/base.rb', line 131

def self.aliased_attributes
  {}
end

.nilify_if_blank(*args) ⇒ Object



80
81
82
83
84
85
86
87
88
89
# File 'lib/common_lib/active_record/base.rb', line 80

def self.nilify_if_blank(*args)
  #  ONLY IF THE FIELD IS A STRING!
  class_eval do
    args.each do |arg|
      before_save {
        self.send("#{arg}=", nil) if self.send(arg).blank?
      }
    end
  end
end

.randomObject

def acts_like_a_hash(*args)



120
121
122
123
124
125
126
127
# File 'lib/common_lib/active_record/base.rb', line 120

def self.random
  count = count()
  if count > 0
    offset(rand(count)).limit(1).first
  else
    nil
  end
end

.validates_uniqueness_of_with_nilification(*args) ⇒ Object



60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/common_lib/active_record/base.rb', line 60

def self.validates_uniqueness_of_with_nilification(*args)
  #  NOTE ANY field that has a unique index in the database NEEDS
  #  to NOT be blank.  Multiple nils are acceptable in index, 
  #  but multiple blanks are NOT.  Nilify ALL fields with
  #  unique indexes in the database. At least those that
  #  would appear on a form, as an empty text box is sent
  #  as '' and not nil, hence the initial problem.
  #  The first one will work, but will fail after.

  #  ONLY IF THE FIELD IS A STRING!
  class_eval do
    validates_uniqueness_of args, :allow_blank => true
    args.each do |arg|
      before_validation {
        self.send("#{arg}=", nil) if self.send(arg).blank?
      }
    end
  end
end

.validations_from_yaml_fileObject

I have found that the validations are really cluttering up the models. Moving them into a yml file and pulling them in like so seems to be working well.

Not all validations are going to work, but so far so good.

codereview.stackexchange.com/questions/159/use-of-a-regex-stored-inside-yaml-file email_regex: !ruby/regexp /^([w.%+-]+)@(\.)([w]2,)$/i stackoverflow.com/questions/3337020/how-to-specify-ranges-in-yaml :in: !ruby/range 5..250 www.opensource.apple.com/source/ruby/ruby-14/ruby/lib/yaml/rubytypes.rb yaml4r.sourceforge.net/doc/page/objects_in_yaml.htm

/opt/local/lib/ruby1.9/1.9.1/syck/rubytypes.rb /opt/local/lib/ruby1.9/1.9.1/psych/visitors/to_ruby.rb

I really like this and I may very well make it a default at some point.



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/common_lib/active_record/base.rb', line 43

def self.validations_from_yaml_file
#   warn "validations_from_yaml_file is now a default from common_lib. You can remove the call from your model."
  validation_file = File.join(Rails.root,"config/validations/#{self.to_s.underscore}.yml")
  if File.exists?(validation_file)
    h = YAML::load( ERB.new( IO.read( validation_file )).result)

    # if the yml file is empty, h is false ( added "if h" condition )
    h.each do |validation|
      attributes=[validation.delete(:attributes), validation.delete(:attribute)
        ].compact.flatten
      self.validates *attributes, validation
    end if h
#   else
#     puts "YAML validations file not found so not using."
  end
end