Seems to me you've solved your own question.
Staff (or "people") is a many-many with projects, with the join table also acting as a role identifier. Since your join here has attributes of its own (the role), probably a has_many :through makes more sense.
Something along the lines of:
class Person < AR has_many :projects, :through => roles ...
It might get interesting if you allow a person to have MULTIPLE roles on a project though.