27998


Ruby on Railsで、ECサイトのスクレイピング処理を実装しております。

・ECサイトの情報を保持するStoreテーブル  
・過去の情報を保持するHistoryテーブル

があり、

[code]

    Store
    - id(主キー)
    - name
    - site_id
    
    History
    - site_id(主キー)
    - ranking
    
[/code]

といったテーブル構成になっております。

スクレイピングをしているため、Historyテーブルの主キーはECサイト側で保持しているsite_idが主キーになります。

そのため、私が管理しているRailsアプリケーションのStoreのidを外部キーにして  
参照することができません。

`尚、Storeテーブルの主キーをsite_idにすれば解決しますが、今回はそうしたくありません`

そうしたくない理由は、StoreテーブルのリレーションがHistoryだけでなく、UserやServiceテーブルとリレーションがあり、idが主キーであった時からの改修が発生するのと、仮に、site_idを主キーとした場合、  
Storeを画面から登録するときに、site_idを間違えて登録してしまった時のバグに気が付きにくくなることを懸念しております。

# 今回やりたいこと

Storeの主キーはidのまま、site_idを外部キーに渡して、Historyテーブルを参照するようにしたいです。

次のような実装方法を試してみたものの、ダメで、主キーである、site_idを元にhisotryテーブルを参照してしまいます・・・

本件に対する解決案がありましたら、アドバイスを頂きたく存じます。

よろしくお願いします。

[code]

    class Store < ActiveRecord::Base
      has_many :histories, foreign_key: 'site_id', class_name: 'History', dependent: :destroy
    end
    
    class History < ActiveRecord::Base
      belongs_to :store, foreign_key: 'site_id', class_name: 'Store'
    end
    
[/code]

尚、こういうことも試しましたが、  
こうすると、既存のstoreのidがsite_idに書き換わってしまうため、断念しました。

[code]

    class Store < ActiveRecord::Base
      self.primary_key = :site_id
    end
    
[/code]

また、広くご意見賜りたいためこちらにも質問させていただいております。  
<https://teratail.com/questions/42905>

# 追記

StoreとHistoryの関係は  
1対多を想定しております。

また、Storeテーブルの主キーをsite‌​_idにすれば解決しますという風に記述しましたが、  
エラーがなく、レコードがとれましたが、正しくとれたかどうかはちょっとわかりません（色々といじっていたため、そのことが直接の原因出ない可能性があります。）

ややこしく申し訳ありません。


CC BY-SA 3.0
2016-08-01T02:16:25.263
27991
2016-08-01T09:12:49.053
2016-08-01T07:03:54.357
13175
13175
question
ruby-on-rails ruby
主キーはデフォルトのidのまま、外部キーのみを指定して、関連テーブルを参照したいです。（外部キーにしているカラムを主キーにすれば解決しますが、そうしたくないため）


StoreモデルとHistoryモデルをsite_idでつなぐ場合、アソシエーションにprimary_keyとforeign_keyの両方を指定すれば動くかと思います。

[code]

    class History < ActiveRecord::Base
      belongs_to :store, foreign_key: 'site_id', primary_key: 'site_id'
    end
    
    class Store < ActiveRecord::Base
      has_many :histories, primary_key: 'site_id', foreign_key: 'site_id', dependent: :destroy
      validates :site_id, uniqueness: true
    end
    
[/code]


CC BY-SA 3.0
2016-08-01T09:12:49.053
27998
2016-08-01T09:12:49.053
5235
27991
answer