Ruby on Rails: ошибка миграции Mailboxer

У меня проблема с Mailboxer в RoR. Я следую официальному руководству по установке драгоценного камня Mailboxer.

Добавить в свой Gemfile:

gem 'mailboxer'

Затем выполните:

$ bundle install

Запустить скрипт установки:

$ rails g mailboxer:install

И не забудьте перенести базу данных:

$ rake db:migrate

Но

    ==  CreateMailboxer: migrating ================================================
-- create_table(:mailboxer_conversations)
   -> 0.0495s
-- create_table(:mailboxer_receipts)
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

wrong number of arguments (4 for 2).../vendor/cache/ruby/1.9.1/gems/foreigner-1.7.4/lib/foreigner/connection_adapters/abstract/table_definition.rb:4:in `foreign_key'
.../vendor/cache/ruby/1.9.1/gems/schema_plus-1.8.9/lib/schema_plus/active_record/connection_adapters/table_definition.rb:171:in `add_foreign_key'
.../vendor/cache/ruby/1.9.1/gems/schema_plus-1.8.9/lib/schema_plus/active_record/column_options_handler.rb:44:in `schema_plus_handle_column_options'
.../vendor/cache/ruby/1.9.1/gems/schema_plus-1.8.9/lib/schema_plus/active_record/connection_adapters/table_definition.rb:137:in `column_with_schema_plus'
.../db/migrate/20150623102808_create_mailboxer.mailboxer_engine.rb:14:in `block in up'
.../vendor/cache/ruby/1.9.1/gems/foreigner-1.7.4/lib/foreigner/connection_adapters/abstract/schema_statements.rb:16:in `call'
.../vendor/cache/ruby/1.9.1/gems/foreigner-1.7.4/lib/foreigner/connection_adapters/abstract/schema_statements.rb:16:in `block in create_table'
.../vendor/cache/ruby/1.9.1/gems/schema_plus-1.8.9/lib/schema_plus/active_record/connection_adapters/schema_statements.rb:44:in `block in create_table_with_schema_plus'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract/schema_statements.rb:160:in `create_table'
.../vendor/cache/ruby/1.9.1/gems/schema_plus-1.8.9/lib/schema_plus/active_record/connection_adapters/schema_statements.rb:39:in `create_table_with_schema_plus'
.../vendor/cache/ruby/1.9.1/gems/foreigner-1.7.4/lib/foreigner/connection_adapters/abstract/schema_statements.rb:14:in `create_table'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/migration.rb:466:in `block in method_missing'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/migration.rb:438:in `block in say_with_time'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/migration.rb:438:in `say_with_time'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/migration.rb:458:in `method_missing'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/migration.rb:334:in `method_missing'
.../db/migrate/20150623102808_create_mailboxer.mailboxer_engine.rb:12:in `up'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/migration.rb:370:in `up'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/migration.rb:410:in `block (2 levels) in migrate'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/migration.rb:410:in `block in migrate'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract/connection_pool.rb:129:in `with_connection'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/migration.rb:389:in `migrate'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/migration.rb:528:in `migrate'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/migration.rb:720:in `block (2 levels) in migrate'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/migration.rb:775:in `call'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/migration.rb:775:in `block in ddl_transaction'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/connection_adapters/abstract/database_statements.rb:192:in `transaction'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/transactions.rb:208:in `transaction'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/migration.rb:775:in `ddl_transaction'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/migration.rb:719:in `block in migrate'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/migration.rb:700:in `each'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/migration.rb:700:in `migrate'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/migration.rb:570:in `up'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/migration.rb:551:in `migrate'
.../vendor/cache/ruby/1.9.1/gems/activerecord-3.2.22/lib/active_record/railties/databases.rake:193:in `block (2 levels) in <top (required)>'
Tasks: TOP => db:migrate

Я использую: mailboxer (0.12.5) rake (10.4.2) rails (3.2.22) ruby ​​(1.9.3p547)

Файлы, сгенерированные rails g mailboxer:install:

# This migration comes from mailboxer_engine (originally 20110511145103)
    class CreateMailboxer < ActiveRecord::Migration
  def self.up    
  #Tables
    #Conversations
    create_table :mailboxer_conversations do |t|
      t.column :subject, :string, :default => ""
      t.column :created_at, :datetime, :null => false
      t.column :updated_at, :datetime, :null => false
    end    
    #Receipts
    create_table :mailboxer_receipts do |t|
      t.references :receiver, :polymorphic => true
      t.column :notification_id, :integer, :null => false
      t.column :is_read, :boolean, :default => false
      t.column :trashed, :boolean, :default => false
      t.column :deleted, :boolean, :default => false
      t.column :mailbox_type, :string, :limit => 25
      t.column :created_at, :datetime, :null => false
      t.column :updated_at, :datetime, :null => false
    end    
    #Notifications and Messages
    create_table :mailboxer_notifications do |t|
      t.column :type, :string
      t.column :body, :text
      t.column :subject, :string, :default => ""
      t.references :sender, :polymorphic => true
      t.column :conversation_id, :integer
      t.column :draft, :boolean, :default => false
      t.string :notification_code, :default => nil
      t.references :notified_object, :polymorphic => true
      t.column :attachment, :string
      t.column :updated_at, :datetime, :null => false
      t.column :created_at, :datetime, :null => false
      t.boolean :global, default: false
      t.datetime :expires
    end    


  #Indexes
    #Conversations
    #Receipts
    add_index "mailboxer_receipts","notification_id"

    #Messages  
    add_index "mailboxer_notifications","conversation_id"

  #Foreign keys    
    #Conversations
    #Receipts
    add_foreign_key "mailboxer_receipts", "mailboxer_notifications", :name => "receipts_on_notification_id", :column => "notification_id"
    #Messages  
    add_foreign_key "mailboxer_notifications", "mailboxer_conversations", :name => "notifications_on_conversation_id", :column => "conversation_id"
  end

  def self.down
  #Tables   
    remove_foreign_key "mailboxer_receipts", :name => "receipts_on_notification_id"
    remove_foreign_key "mailboxer_notifications", :name => "notifications_on_conversation_id"

  #Indexes
    drop_table :mailboxer_receipts
    drop_table :mailboxer_conversations
    drop_table :mailboxer_notifications
  end
end

# This migration comes from mailboxer_engine (originally 20131206080416)
class AddConversationOptout < ActiveRecord::Migration
  def self.up
    create_table :mailboxer_conversation_opt_outs do |t|
      t.references :unsubscriber, :polymorphic => true
      t.references :conversation
    end
    add_foreign_key "mailboxer_conversation_opt_outs", "mailboxer_conversations", :name => "mb_opt_outs_on_conversations_id", :column => "conversation_id"
  end

  def self.down
    remove_foreign_key "mailboxer_conversation_opt_outs", :name => "mb_opt_outs_on_conversations_id"
    drop_table :mailboxer_conversation_opt_outs
  end
end

# This migration comes from mailboxer_engine (originally 20131206080417)
class AddMissingIndices < ActiveRecord::Migration
  def change
    # We'll explicitly specify its name, as the auto-generated name is too long and exceeds 63
    # characters limitation.
    add_index :mailboxer_conversation_opt_outs, [:unsubscriber_id, :unsubscriber_type],
      name: 'index_mailboxer_conversation_opt_outs_on_unsubscriber_id_type'
    add_index :mailboxer_conversation_opt_outs, :conversation_id

    add_index :mailboxer_notifications, :type
    add_index :mailboxer_notifications, [:sender_id, :sender_type]

    # We'll explicitly specify its name, as the auto-generated name is too long and exceeds 63
    # characters limitation.
    add_index :mailboxer_notifications, [:notified_object_id, :notified_object_type],
      name: 'index_mailboxer_notifications_on_notified_object_id_and_type'

    add_index :mailboxer_receipts, [:receiver_id, :receiver_type]
  end
end

Благодарю вас!


person Enrico Eugenio    schedule 23.06.2015    source источник
comment
Можете ли вы опубликовать файлы миграции, созданные почтовым ящиком?   -  person Aetherus    schedule 23.06.2015
comment
Закомментируйте эти строки add_foreign_key и remove_foreign_key, это работает?   -  person Aetherus    schedule 23.06.2015
comment
@Aetherus Если я закомментирую это, это все равно не сработает. Это работает, если я закомментирую t.column :notification_id, :integer, :null => false, но, очевидно, это не создаст таблицу правильным образом.   -  person Enrico Eugenio    schedule 23.06.2015


Ответы (1)


У меня была эта ошибка с использованием «рельсов», «~> 5.1.4». Я знаю, что вы используете совершенно другую версию, но это то, что я сделал, чтобы решить проблему. В 3 созданных файлах миграции я добавил в конце [4.2] ([5.1] не работает).

class CreateMailboxer < ActiveRecord::Migration[4.2]
  // blah, blah
end

class AddConversationOptout < ActiveRecord::Migration[4.2]
  // blah, blah
end

class AddMissingIndices < ActiveRecord::Migration[4.2]
  // blah, blah
end

Надеюсь, это поможет.

person Noel Delgado    schedule 06.11.2017