0

activerecord-sqlserver-adapterRuby on Rails を使用して既存の Microsoft SQL Server に接続するためにgemを使用しています。次のよう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 

モデル/足場が正しく生成されました。20120718221629_create_sites.rbgenerate コマンドは、次のようにデータベース移行ファイルを作成しました

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:migratecommend を実行すると、次のエラー メッセージが表示されます。

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、テーブルがうまく作成されます。テーブルが作成されると、外部キーがそこにないことがわかります。この問題を変更/修正するにはどうすればよいですか?

アップデート

問題は見つかったと思いますが、変更方法がわかりません。テーブルプレフィックスを使用しているため、 + + {index_name}msr.FSCR_のプレフィックスを持つインデックス名を作成しようとしているため、挿入は作成しようとしています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 migration ファイルを次のように変更することで、この問題を修正できました。

生成されたファイル

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 に答える