water/mainline — comment on commit 0904da16fdbda0fcc33fe76c951d755487607ec5
File: app/models/assistant.rb line 1
By oleander:

Grävde lite djupare i de hela och fick fram att arvsmetodiken kallas Single Table Inheritance.
Det enda man behöver göra för att få STI att fungera är att skapa ett `type:string` attribut i `User`-klassen.

Resterande fixar Rails m.h.a lite meta-programmerings-hax.

``` ruby
class User < ActiveRecord::Base
#
# @type Symbol
# @return Boolean Is user what we think he/she/it is?
# Example:
# current_user.role?(:assistant)
#
def role?(type)
type.to_s.classify == self.type
end
end
```

Eller lite meta-programmering i sin läskigaste form (@Tarrasch).

``` ruby
class User < ActiveRecord::Base
@@types = ["assistant", "student", "examiner"]

#
# @return Boolean | Unknown
#
# Example:
# current_user.assistant?
# current_user.stupid?
#
def method_missing(method, args, &block)
if method =~ /\?$/ and @@types.include?(method.to_s.downcase)
method.to_s.gsub(/\?$/, "").classify == self.type
else
super
end
end
end
```

I båda fallen kan vi ärva direkt från `User`.

``` ruby
class Assistant < User
has_many :registered_courses
end
```

``` ruby
current_user = Assistant.create!(name: "John Doe")

# First example
current_user.role?(:assistant)

# Second example
current_user.assistant?
```
Jag tror att det enklaste är att skapa en ny branch, leka lite med arven och se vart vi landar.