Rails迁移模式问题

时间:2015-05-21 15:17:44

标签: ruby-on-rails ruby ruby-on-rails-4 rails-migrations

在我的rails应用程序中,我在数据库中有三个模型/表(用户,注册人,事件)。当我遇到一个问题,说我找不到事件表时,我正在设置一些Capybara / RSpec测试。

现在事件模型工作正常,我已经能够创建事件,进入rails控制台并查询事件,例如Events.all或Events.find(1)。令我困惑的是我的架构。我的架构有

create_table "registrations", force: true do |t|
    t.string   "first_name"
    ...
end

create_table "users", force: true do |t|
    t.string   "email",                  default: "",    null: false
    ...
end

但是没有对events表的引用。自从我为事件生成模型以来已经过了一段时间,但这里是迁移:

class CreateEvents < ActiveRecord::Migration
  def change
    create_table(:events) do |t|
      t.string :name
      t.string :location

      t.timestamps
    end
  end
end

我已经运行了rake db:reset和rake db:migrate等命令,以确保我的所有迁移都是最新的。任何想法为什么事件表不在架构中?

更新 所以我删除了数据库和架构,并开始一次迁移一个迁移。当我运行迁移来创建它时,事件表就在那里,但是在我运行以下命令之后,表从模式中消失了:

class AddingAssociationsToEventsUserModels < ActiveRecord::Migration
  def change
    add_column :events, :belongs_to, :user, index: true
  end
end

以下是正在运行的迁移:

rake db:migrate:redo VERSION=20150518132834
== 20150518132834 AddingAssociationsToEventsUserModels: migrating =============
-- add_column(:events, :belongs_to, :user, {:index=>true})
   -> 0.0006s
== 20150518132834 AddingAssociationsToEventsUserModels: migrated (0.0006s) ====

2 个答案:

答案 0 :(得分:3)

那是因为development数据库和RAILS_ENV=test rake db:drop && rake db:create && rake db:migrate 数据库不匹配。

执行命令

RAILS_ENV=test rake db:test:prepare

RAILS_ENV=test rake db:reset

WHSWorkId id = 'LAM-000052';
WHSPickListShippingController controller;
Args args;
WHSShipmentTable whsShipmentTable;
WHSWorkTable whsWorkTable;
clWHSPickListShippingContract contract; //My custom RDP Contract  

whsShipmentTable = WHSShipmentTable::find(whsWorkTable.ShipmentId);

args = new Args(ssrsReportStr(WHSPickListShipping, Report));
args.record(whsShipmentTable);
args.parm(whsShipmentTable.LoadId);

contract = new clWHSPickListShippingContract();

controller = new WHSPickListShippingController();
controller.parmReportName(ssrsReportStr(WHSPickListShipping, Report));
controller.parmShowDialog(false);
controller.parmLoadFromSysLastValue(false);
controller.parmReportContract().parmRdpContract(contract);
controller.parmReportContract().parmRdpName(classStr(clWHSPickListShippingDP));
controller.parmReportContract().parmRdlContract().parmLanguageId(CompanyInfo::languageId());
controller.parmArgs(args);

controller.startOperation();

上述任何一项都应该有效。

答案 1 :(得分:1)

好的,这个问题在我的迁移文件中是个错误。以下是我将迁移更改为:

class AddingAssociationsToEventsUserModels < ActiveRecord::Migration
  def change
    add_reference :events, :user, index: true
  end
end

现在,事件表在我的架构中,测试可以找到该表并正在传递!