1

Мне нужно использовать 14-значный bigInt в качестве первичного ключа в приложении 4.1.2 рельсов. Использование старых постов на SO в качестве руководства, я придумал следующее для решения этой проблемы ...Рельсы 4 MySQL большие проблемы и ошибки первичного ключа

class CreateAcctTransactions < ActiveRecord::Migration 
     def change 
     create_table "acct_transactions", :id => false do |t| 
      t.integer :id, :limit => 8,null: false 
      t.integer "account_id",limit: 8,null: false 
      t.integer "transaction_type_id", null: false 
      t.datetime "date",null: false 
      t.text  "description",limit: 255 
      t.decimal "amount",precision: 10, scale: 2, null: false 
     end 
     end 
    end 

Однако этот метод не очень назначьте «ID» в качестве первичного ключа , это просто другое обычное поле. Кроме того, когда я получаю следующее сообщение об ошибке ...

Mysql2::Error: Field 'id' doesn't have a default value: INSERT INTO acct_transactions (account_id , amount , date , description , transaction_type_id) VALUES (224149525446, 222.450361056561, '1970-12-18 00:00:00', 'Transfer', 6)

, когда я пытаюсь запустить следующий файл семян ...

account_transactions = [] 

    accounts.each do |i| 
     80.times do |j| 
      type = types.sample 
     case (type) 
      ... 
     end 

     t = AcctTransaction.new 
     t.id = SecureRandom.random_number(99999999999999) # 14-digit BigInt 
     t.account_id = accounts[j].id 
     t.transaction_type_id = type 
     t.date = Time.at((Time.now.month - 18) + rand * (Time.now.to_f)).to_date 
     t.description = description 
     t.amount = amount 

     t.save 
     account_transactions << t 
     end 
    end 

Миграция работает нормально, но таблица не будет и семя id не является первичным. Я сделал ошибку? Или есть лучший способ сделать это?

Большое спасибо

+0

Возможный дубликат [rails3 bigint primary key] (http://stackoverflow.com/questions/5880207/rails3-bigint-primary-key) – eritiro

ответ

1

Я установил ее, написав миграцию с выполнением SQL следующим образом:

class CreateAcctTransactions < ActiveRecord::Migration 
     def self.up 
     # create ACCT_TRANSACTIONS table 
      create_table "acct_transactions", id: false, force: true do |t| 
      t.integer "id",     limit: 8,       null: false 
      t.timestamp "date",              null: false 
      t.text  "description",   limit: 255 
      t.decimal "amount",       precision: 10, scale: 2, null: false 
      t.integer "account_id",   limit: 8,       null: false 
      t.integer "transaction_type_id",          null: false 
      end 
      execute "ALTER TABLE acct_transactions ADD PRIMARY KEY (id);" 
      add_index "acct_transactions", ["account_id"], name: "fk_acct_transactions_accounts1_idx", using: :btree 
      add_index "acct_transactions", ["date", "id"], name: "BY_DATE", using: :btree 
      add_index "acct_transactions", ["transaction_type_id"], name: "fk_acct_transactions_transaction_types1_idx", using: :btree 
     end 

     def self.down 
     drop_table :acct_transactions 
     end 
    end 

Обратите внимание на выполнить оператор @ линии 12. В то время как я был там, я изменил «дата» в метку времени, которую я хотел сделать изначально в любом случае. Это некрасиво и нарушает «конвенцию», но она отлично работает, поэтому я могу двигаться дальше. Спасибо, что посмотрели.

+0

Это будет работать, только если вы запускаете миграции, а не при создании базы данных используя schema.rb (например, если вы используете rake db: setup). – PDug