環境
rails4、postgresql
rails実行:developmentは自宅、dev,staging,productionはEC2。
database:developmentは自宅、dev,staging,productionはAmazonのRDB
EC2、RDBともdev,stagingは同じサーバ、productionが独立。
厄介なことに、databaseは もともと使っていたdatabaseと今回新たに連携を行うことになった別システムのdatabaseの二つを用いざるを得なくなっています。
どうしたいか
f.fields_for :meisais,@meisais do |meisai|
を評価するとき、railsは meisais tableを検索に行くのだということを一昨日発見しました。@meisaisが有っても。
(1)このtable検索を行わないようにするか、
(2)関連するモデルのtableのjoinを行わないようにする か
したい。もしくは「問題」を回避する手段があればそれでも。
モデル
Request、Meisai、Baitai、MasterTorihikiski、MasterTorihikiski の関連は以下です。
他にも belongs_to やら has_*があります
この内Master二つが別databaseです。別databaseを見に行くための設定は省略しました。
class Request < ActiveRecord::Base has_many :meisais, :dependent => :destroy belongs_to :master_torihikisaki class Meisai < ActiveRecord::Base belongs_to :request belongs_to :baitai belongs_to :master_torihikisaki class Baitai < ActiveRecord::Base has_many :meisais belongs_to :master_orikomi_medium class MasterTorihikisaki < ActiveRecord::Base has_many :meisais has_one :master_torihikisaki_info class MasterTorihikisakiInfo < ActiveRecord::Base belongs_to :master_torihikisaki
問題
「f.fields_for :meisais,@meisais」評価時にSELECT "meisais"."id"。。。
が実行されます。このとき、直接関連している 2tableがINNER JOIN "baitais" ON、、LEFT OUTER JOIN "master_torihikisakis"
とjoinされます。
二つのdatabaseをまたがるjoinなのですが、local、devの環境では問題が出ず、stagingでerror_500: PG::UndefinedTable: ERROR: relation "master_torihikisakis" does not exist
というエラーとなりました。
試したこと
1)database.ymlをいじって dev、stagingのDBを入れ替えると stagingはOK、devでNGとなるので、元システムのdatabaseの設定にも違いがあるのではと考えています(この設定も内容確認も権限がないのでお伺いを立てているところ)
2)モデルMeisaiの belongs_to master_torihikisaki
を削除するとJOINしなくなりエラーがなくなることは確認できました。
ただ、関連宣言前提でcodeが作られていることと、他databaseをbelongs_toする他のモデルもありこれらも直すとなると工数もテストのやり直しもばかにならないのでできれば避けたいです。
欲しいお知恵
- f.fields_for 評価時にdatabaseをアクセスさせない設定はあるか
- f.fields_for でのdatabaseアクセス時に、関連tableをJOINさせない設定はあるか
- 複数databaseをまたがるJOINの成否を分けるのはどういう条件があるか
追記
PostgreSQLのDbLink拡張、dblink_connect というものがあるとのことで、この設定がdev、stagingのdatabaseで違っていないか、というお伺いを追加しました。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。