I'm unsure on whether this behavior is entirely undesirable, but it's definitely not what I had expected in my use case (ensuring that a join table record exists). Perhaps there should be a variant (find_or_create_exactly, perhaps?) that uses the supplied attributes as additional conditions.
If nothing else, the documentation should be updated to reflect this scenario - the last case in the examples *almost* describes this scenario, but the block form used there makes it unclear what:
User.where(:first_name => 'Scarlett').first_or_create(:last_name => "O'Hara")
I also found that DataMapper implements the behavior I was expecting in their first_or_create method:
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group.
To post to this group, send email to firstname.lastname@example.org.
To unsubscribe from this group, send email to email@example.com.
For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en.