2011-12-16 7 views
1

У меня есть 2 модели в моей рельсы приложение, один с UUID первичного ключа: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 запроса в файле журнала. Почему нетерпевая загрузка не работает, когда мы меняем ключ ID для ключа UUID?

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 

Есть обходной путь? Если я изменю ключ uuid для ключа id, но сохраните строковый формат для хранения uuid, будет ли это нормально?

Спасибо,

ответ

3

Использование присоединяется вместо включать, чтобы получить внутреннее соединение

включает в себя всегда выдает 2-й запрос, но не п + 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 

см http://guides.rubyonrails.org/active_record_querying.html для получения дополнительной информации

Я не думаю, что тот факт, который вы используете UUID бы никакой разницы

+0

Спасибо. На самом деле, я пробовал со многими пользователями, и все в порядке: у меня есть 2 запроса для пользователей X. <% @users = User.find: all,: include => [: country]%> <% @ users.each do | user | %> <% =% user.country.name> <% end %> нагрузки пользователя (0.5мс) ВЫБОР 'users'. * FROM' users' Страна нагрузки (0,5 мс) ВЫБРАТЬ '' стран. * FROM '' стран WHERE ('countries' .'uu' IN ('1', '2')) –

Смежные вопросы