1

Rails 3 アプリでレガシー データを移行するために追加の MySQL データベースをセットアップしています。このクラスを介して簡単に接続できます。

class External < ActiveRecord::Base
  self.abstract_class = true
  establish_connection :legacy
end

このクラスを継承する 2 つのモデルがあります。

class LegacySize < External

  set_table_name 'size'
  set_primary_key 'size_id'
  belongs_to :product, :class_name => 'LegacyProduct', :foreign_key => 'product_id'

end

class LegacyProduct < External

  set_table_name 'product'
  set_primary_key 'product_id'
  has_many :sizes, :class_name => 'LegacySize'

end

いくつかの単純な ActiveRecord クエリで問題ないように見えます。

> ls = pp LegacySize.all
  LegacySize Load (0.8ms)  SELECT `size`.* FROM `size` 
[#<LegacySize size_id: 1, name: "small", product_id: 1>,
 #<LegacySize size_id: 2, name: "medium", product_id: 1>,
 #<LegacySize size_id: 3, name: "large", product_id: 1>]

> lp = pp LegacyProduct.all
  LegacyProduct Load (0.7ms)  SELECT `product`.* FROM `product` 
[#<LegacyProduct product_id: 1, name: "shirt", price: 10.0>]

しかし、関連付けにアクセスしようとすると、「product_id」ではなく「legacy_product_id」列が検索されます。これは、サイズ モデルで外部キーとして定義しています。

> lp = LegacyProduct.find(1).sizes
  LegacyProduct Load (0.9ms)  SELECT `product`.* FROM `product` WHERE `product`.`product_id` = 1 LIMIT 1
  LegacySize Load (0.6ms)  SELECT `size`.* FROM `size` WHERE `size`.`legacy_product_id` = 1
Mysql2::Error: Unknown column 'size.legacy_product_id' in 'where clause': SELECT `size`.* FROM `size`  WHERE `size`.`legacy_product_id` = 1
ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'size.legacy_product_id' in 'where clause': SELECT `size`.* FROM `size`  WHERE `size`.`legacy_product_id` = 1

誰かが私が間違っていることを見ていますか?

4

1 に答える 1

0

foreign_keyオプションを から に移動しbelongs_toますhas_many :sizes

class LegacyProduct < External
    ...
    has_many :sizes, :class_name => 'LegacySize', :foreign_key => 'product_id'
    ...
于 2012-04-19T02:05:09.560 に答える