2011-12-16 12 views
1

私は私のレールのアプリで2機種、UUIDプライマリキーと1持っている:のRails + UUID +イーガーロード

class User < ActiveRecord::Base 
    belongs_to :country, :foreign_key => 'country_uuid' 
end 

class Country < ActiveRecord::Base 
    set_primary_key :uuid 
    has_many :users 
end 

私はそのような何かしてみてください:

<% @user = User.find :first, :include => [:country] %> 
<%= @user.country.name %> 

を私は良いを持っているが結果、ログファイルに2つのリクエストがあります。 UUIDキーのIDキーを変更したときに読み込みがうまくいかない理由

User Load (0.4ms) SELECT `users`.* FROM `users` LIMIT 1 
Country Load (0.4ms) SELECT `countries`.* FROM `countries` WHERE (`countries`.`uuid` = '1') 

そして、私のようなものだろう:

User Load (0.4ms) SELECT `users`.* FROM `users` INNER JOIN countries ON countries.uuid = users.country_uuid LIMIT 1 

は、回避策はありますか? idキーのuuidキーを変更しても、uuidを格納する文字列フォーマットを維持しても問題ありませんか?

おかげで、

答えて

3

使用が加入する代わりに、内側が

はいつもあなたが行っている方向のため

を第二のクエリを発行ではなく、N + 1クエリ(怠け者)が含ま参加得るために含めますユーザー - >それは

それほど重要ではありませんが、1つの国あなたが他の方向の国を行っていた場合 - >多くのユーザー

country = Country.first 
# => select countries.* from countries where id = xxxx limit 1; 
country.users.each do 
    # select users.* from users where user_id = xxxx; 
    # this could be bad because of lazy loading, one query per iteration 
end 

# vs... 
country = Country.first.includes(:users) 
# => select countries.* from countries where id = xxxx limit 1; 
# => select users.* from users where country_uuid IN (xxxx); 
country.users.each do 
    # users are all in memory 
end 

私はあなたがUUIDを使用しているという事実は、任意の違いに

+0

感謝をしなければならないと思うの詳細情報

ためhttp://guides.rubyonrails.org/active_record_querying.htmlを参照してください。 実際、私は多くのユーザーと試してみました。大丈夫です:私はXユーザーに対して2つのクエリを持っています。 <%@users = User.find:all、:include => [:country]%> <%@ users.each do | user | %> <%= user.country.name%> <% end %>ユーザー負荷(0.5ミリ秒) 'users'を選択します。*' users' カントリー・ロード(0.5ミリ秒)から、 'countries'をSELECT * FROM countries'' WHERE( 'countries'.uuid'IN( '1'、 '2')) –