2009-02-05 4 views
8

У меня есть миграция БД так:идентификатор поля без опции автоинкремента в миграции

class CreateParticipations < ActiveRecord::Migration 
     def self.up 
     create_table(:participations, :primary_key => 'Seat') do |t|  
      t.integer :Seat 
      t.string :Nickname 
      t.string :Clan 
      t.string :FirstName 
      t.string :LastName 
      t.string :Email 
      t.boolean :Payed 

      t.timestamps 
     end 
     end 

     def self.down 
     drop_table :participations 
     end 
    end 

Теперь сиденье создаются с помощью автоматического приращения. Однако я этого не хочу. Я хочу его без автоматического увеличения. Я сам определяю себя в своей логике.

Я искал вокруг, но не могу найти, как отключить auto_increment.

Как это сделать? За исключением ручного выполнения этого в MySQL.

+0

Вы действительно уверены, что хотите это сделать? Это противоречит конвенции, которая очень хорошо работает во всех рельсах и приведет к большому количеству дополнительной работы в остальной части вашего приложения, что делает это исключение для правила работой повсюду. Возможно, «Seat» только в поле на этой таблице с уникальным индексом. Если вам это не понадобится, чтобы адаптироваться к устаревшей схеме, это, как правило, плохая идея. К сожалению, я не знаю ответа на ваш вопрос. –

+0

Я знаю, что это оживление мертвых здесь, но относительно тривиальный пример может быть моделью, привязанной к службе non-Rails, которая управляет идентификаторами внутри этой службы. В Rails не было бы необходимости автоматически увеличивать число, потому что было бы разумнее связать представление Rails с идентификатором представления службы non-Rails, а не генерировать еще ДРУГОЙ идентификатор и управлять ДРУГОЙ совокупностью ограничений. Тем не менее, без каких-либо подробностей относительно необходимости в первоначальном обстоятельстве афер, я бы согласился с вами. –

ответ

1

Есть ли причина, по которой вы не можете использовать ключ id rails и вручную добавить индекс Seat?

Я видел несколько хаков только для того, чтобы получить рельсы для работы с базами данных без инкремента. Я не думаю, что это вариант. Если я помню, именно так rails обращается ко всем своим функциональным возможностям.

Честно говоря, как-напросто - вам нужно небольшое повышение эффективности игнорирования структуры рельсов?

Я думаю, что реальный ответ «вы не можете». У Activerecord есть несколько вещей, на которые он не будет нагибаться.

+0

Я портирую приложение ASP.MVC, где у меня есть пользовательская логика BLL и DAL, но теперь имеет смысл – IceHeat

17

Для записи, если вы абсолютно необходимо это сделать (это не должно происходить часто), вот способ сделать без автоинкрементом первичного ключа с Rails миграции DSL:

create_table(:table_name, :id => false) do |t| 
    t.integer :id, :options => 'PRIMARY KEY' 
end 

Это будет работать в MySQL в любом случае, если ваша БД использует различный синтаксис для указания первичного ключа, замените :options => 'PRIMARY KEY' тем, что есть.

+1

Обратите внимание, что это все еще имеет некоторые проблемы, потому что Rails слегка манит имя идентификатора. В то время как он нарушает соглашения об именах, имея в виду, что нужно закодировать вещи вокруг, называя поле первичного ключа, возможно, предпочтительнее другое, чем id. –

+1

Если я назову его чем-то другим, мне нужно будет изменить свой route.rb, Cancan 'load_resource' и так далее? Благодаря ~ – lulalala

2

Этот вопрос 3-х лет, но упаковывают кто-то интересно спустя 3 года, как я, вы все это «change_column» в случае таблица уже создана:

change_column(:table_name, :id, :integer, :null => false) 

Это должно работать в Rails 2.x и 3.x.

O

0

Не говоря его хорошая идея, но вот как я это сделал для SQLite3 - просто заменить, что SQLiteAdapter с адаптером вашего децибел - вы можете сделать это уборщик/короткое замыкание с вызовом define_method

class AbstractAdapter 
end 

module ActiveRecord 
    module ConnectionAdapters 
    class SQLiteAdapter < AbstractAdapter 
     def supports_autoincrement? 
     false 
     end 
    end 
    end 
end 

<then you migration> 

или

class SomeMigration < ActiveRecord::Migration 
    def change 
    create_table :table do |t| 
     ActiveRecord::ConnectionAdapters::SQLiteAdapter.send :define_method, :supports_autoincrement? do false end 
     t.integer etc 
    end 
    end 
end 

конечно просто изменить адаптер для другого децибел

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