4

nginxとunicornを実行しているサーバーで、2つの異なるデータベースに接続するようにレールを構成しています。負荷が軽い場合でも、2番目のRailsデータベースにアクセスするエンドポイントへのWebリクエストは、他のリクエストからの結果を返します。

たとえば、とへの同時呼び出しがhttp://example.com/user/111/addressあるhttp://example.com/user/222/address場合、ユーザー222のアドレスが両方の呼び出しに対して返されることもあれば、ユーザー111のアドレスが両方の呼び出しに対して返されることもあります。

アドレスのエンポイントは非常に基本的です。

class UserController < ApplicationController
  before_filter :load_user

  def address
    address = @user.address
    render json: address, status: 200 
  end 

  private 

  def load_user
    @user = User.find params[:id]
  end 
end 

モデルUserAddress両方が2番目のデータベースにアクセスし、そのデータベースに接続する基本クラスから継承します。

class OtherDbActiveRecord < ActiveRecord::Base
  self.abstract_class = true
  establish_connection "#{Rails.env}_other_db"
  # Prevent creation of new records and modification to existing records
  def readonly?
    return true
  end

  # Prevent objects from being destroyed
  def before_destroy
    raise ActiveRecord::ReadOnlyRecord
  end
end

class User < OtherDbActiveRecord
  has_one :address
end 

class Address < OtherDbActiveRecord
  belongs_to :user 
end 

欠落している2番目のデータベースに接続する手順はありますか?ActiveRecordが別のクエリの結果を返す原因は何ですか?

4

1 に答える 1

0

OtherDbActiveRecord は単一のオブジェクトです。各 ruby​​ クラスはオブジェクトであり、単一のオブジェクトです。Establish_connection を呼び出すと、その (1 つの) オブジェクトの状態が指定された接続に設定されます。

それぞれ異なるクラス名を持つ重複したクラスを作成してみてください。

class User < ActiveRecord::Base
end

class UserOther < OtherDbActiveRecord
end

class Address < ActiveRecord::Base
end

class Address Other < OtherDbActiveRecord
end
于 2012-09-17T23:17:46.740 に答える