У меня также был странный опыт с find_or_create.Мне бы понравилось, если бы это сработало, но это кажется противоречивым.
В настоящее время у меня та же проблема, что и у вас, и я думаю, что это может быть связано с вызовом find_or_create для ассоциации, а не для модели напрямую.Вот мой пример:
permission_assignments.find_or_create_by_role_id(:role_id => role_id, :is_allowed => false)
Это работает для создания назначения, за исключением того, что для поля is_allowed установлено значение по умолчанию "true".Этот код работает для меня (в модели разрешений, отсюда и собственная ссылка)
PermissionAssignment.find_or_create_by_permission_id_and_role_id(:permission_id => self.id, :role_id => role_id, :is_allowed => false)
К сожалению, он более многословен, но работает.Единственная проблема, которую я до сих пор замечаю, заключается в том, что возвращаемому объекту не присвоен идентификатор (однако запись создается в базе данных, однако, если бы я захотел обновить какие-либо атрибуты, я бы не смог без идентификатора),Не знаю, является ли это отдельной проблемой или нет.
Rails 3.0.4 здесь с Postgres 8.4