Я пытаюсь настроить модель с использованием 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, который защищает идентификатор от изменений?
Ах, очень приятно. 'set_primary_key' сделал трюк. Благодаря! Основываясь на миграции, я немного удивлен, что Rails будет вести себя иначе, чем со стандартным идентификатором. Ну что ж. – lobati