【问题标题】:Ruby on Rails: Mailboxer migration errorRuby on Rails:邮箱迁移错误
【发布时间】:2015-09-09 03:38:00
【问题描述】:

我对 RoR 中的 Mailboxer 有疑问。 我按照官方指南安装 Mailboxer gem。

添加到您的 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

我使用: 邮箱 (0.12.5) 耙子 (10.4.2) 导轨 (3.2.22) 红宝石 (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

谢谢!

【问题讨论】:

  • 能把mailboxer生成的迁移文件贴出来吗?
  • 注释掉那些add_foreign_keyremove_foreign_key行,有用吗?
  • @Aetherus 如果我注释掉这些,它仍然不起作用。如果我注释掉t.column :notification_id, :integer, :null =&gt; false,它会起作用,但显然它不会以正确的方式创建表格。

标签: ruby-on-rails ruby ruby-on-rails-3.2 migrate mailboxer


【解决方案1】:

我在使用“rails”时遇到了这个错误,“~> 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

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2012-11-11
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 2015-04-09
    • 2019-12-24
    • 2017-10-29
    • 1970-01-01
    相关资源
    最近更新 更多