0

我正在使用 gemactiverecord-sqlserver-adapter连接到使用 Ruby on Rails 的现有 Microsoft SQL Server。我修改了config\application.rb文件以将我table_name_prefix的设置如下

config.active_record.table_name_prefix = 'msr.FSCR_'

这样我使用 Ruby on Rails 创建的所有表都在msr模式中,并与FSCR_前缀组合在一起。我有一个使用以下创建的表/脚手架

rails generate scaffold Customer name:string status:string 
rake db:migrate

它创建了msr.FSCR_customers正确的表。然后我为网站创建了一个模型,如下所示

rails generate scaffold Site name:string addr1:string addr2:string city:string
    state:string zip:string 

并且模型/脚手架已正确生成。generate命令创建的数据库迁移文件20120718221629_create_sites.rb如下

class CreateSites < ActiveRecord::Migration
  def change
    create_table :sites do |t|
      t.string :name
      t.string :addr1
      t.string :addr2
      t.string :addr3
      t.string :city
      t.string :state
      t.string :zip
      t.string :phone
      t.string :fax
      t.integer :created_by
      t.references :customer

      t.timestamps
    end
    add_index :sites, :customer_id
  end
end

但是,当我运行rake db:migrate推荐时,我收到以下错误消息:

ODBC::Error: 37000 (102) [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect
syntax near '.'.: CREATE INDEX [index_msr].[FSCR_sites_on_customer_id] ON [msr].
[FSCR_sites] ([customer_id])

如果我注释掉这行add_index :sites, :customer_id它会创建表格就好了。创建表时,我看到我的外键不存在。如何更改/解决此问题?

更新

我想我找到了问题,但我不知道如何改变它。因为我正在使用它的表前缀,msr.FSCR_所以它试图创建前缀为 ++ {index_name} 的索引名称,index_所以msr.FSCR_插入试图创建

[index_msr].[sites_on_customer_id]

没有架构,index_msr所以我希望这会失败。我真正想要的是索引名称是

[index_msr_sites_on_customer_id]

有没有办法].[从类的创建索引部分中删除ActiveRecord

4

2 回答 2

0

您没有 customer_id 列。添加它会有所帮助吗?或者只是在站点上添加索引并摆脱 customer_id

于 2012-07-19T00:08:20.927 回答
0

我可以通过修改从 rails 生成的 db 迁移文件来解决这个问题,如下所示:

生成的文件

class CreateSites < ActiveRecord::Migration
  def change
    create_table :sites do |t|
      t.string :name
      t.string :addr1
      t.string :addr2
      t.string :addr3
      t.string :city
      t.string :state
      t.string :zip
      t.string :phone
      t.string :fax
      t.integer :created_by
      t.references :customer

      t.timestamps
    end
    add_index :sites, :customer_id
  end
end

更新后的文件

class CreateSites < ActiveRecord::Migration
  def change
    create_table :sites do |t|
      t.string :name
      t.string :addr1
      t.string :addr2
      t.string :addr3
      t.string :city
      t.string :state
      t.string :zip
      t.string :phone
      t.string :fax
      t.integer :created_by
      t.references :customer

      t.timestamps
    end
    add_index :sites, :customer_id, :name => 'sites_by_customer'
  end
end
于 2012-07-20T21:07:04.553 回答