2011-11-07 2 views
0

Я пытаюсь настроить модель с использованием UUID вместо автоматического увеличения. Не утруждая с UUID части, вот что мой код выглядит следующим образом:Невозможно вручную назначить id в rails 3.1

class CreateUsers < ActiveRecord::Migration 
    def change 
    create_table :users, :id => false do |t| 
     t.column :id, 'char(36) binary', :null => false, :primary => true 
     t.string :email 
     t.string :username 
     t.string :password_hash 
     t.string :password_salt 

     t.timestamps 
    end 
    end 
end 

Модель пользователя только имеет:

class User < ActiveRecord::Base 
end 

При попытке назначить id в консоли он не принимает :

ruby-1.9.3-p0 > u = User.new 
=> #<User id: nil, email: nil, username: nil, password_hash: nil, password_salt: nil, created_at: nil, updated_at: nil> 
ruby-1.9.3-p0 > u.id = 'stuff' 
=> "stuff" 
ruby-1.9.3-p0 > u.id 
=> nil 
ruby-1.9.3-p0 > u.id = UUIDTools::UUID.random_create.to_s 
=> "d3cd5bef-22b4-4fb1-b00f-10d8bbc94dc1" 
ruby-1.9.3-p0 > u.id 
=> nil 
ruby-1.9.3-p0 > u.email = 'stuff' 
=> "stuff" 
ruby-1.9.3-p0 > u.email 
=> "stuff" 

Почему я не могу присвоить идентификатор вручную? Если я назову столбец чем-то другим, он будет работать, но я предпочел бы использовать поле id, поэтому мне не нужно переопределять все магии рельсов. Кажется, что он отлично работает в Rails 2. Есть ли какой-то параметр Rails, который защищает идентификатор от изменений?

ответ

1

Попробуйте использовать это:

set_primary_key :id 

в моделях.

Существует также activeuuid plugin.

This SO post похоже на резервную копию set_primary_key вещь, по крайней мере частично.

+0

Ах, очень приятно. 'set_primary_key' сделал трюк. Благодаря! Основываясь на миграции, я немного удивлен, что Rails будет вести себя иначе, чем со стандартным идентификатором. Ну что ж. – lobati

Смежные вопросы