The most common way to define class methods is by defining them directly with
self (the class in the current context) on a method by method basis:
class User
def self.find_by(attrs)
# lookup logic ...
end
endIf you have a group of class methods you want to define, you can stick them all
within a class << self block which does similarly defines each of them as
singleton methods of that class (User in this case):
class User
class << self
def find_by_email(email)
# lookup logic ...
end
def find_by_last_name(last_name)
# lookup logic ...
end
end
endThis opens the singleton class of User for modification, adding these two new
methods.
We can see those defined alongside all other direct and inherited class methods:
> User.methods
=>
[:find_by_email,
:find_by_last_name,
:yaml_tag,
:allocate,
...
]