рельсы 3: включить с find () - PullRequest
       1

рельсы 3: включить с find ()

2 голосов
/ 25 апреля 2011

У меня есть модель User, которая имеет has_many: messages и Message, которые принадлежат_to: user.

когда я делаю Message.find (1,: include =>: user), он не возвращает мне пользователя, но если я делаю Message.find (1) .to_json (: include =>: user), он включает пользовательский объект в хэше.

Как мне сделать так, чтобы оно было включено в Message.find (1,: include =>: user)?

Ответы [ 4 ]

8 голосов
/ 25 апреля 2011

Это случай энергичной / ленивой загрузки.Когда вы делаете:

Message.find(1, :include => :user)

Вы активно загружаете пользователя, потому что, когда вы звоните @message.user, вы не делаете другой запрос для извлечения пользователя, тогда как делаете:

Message.find(1)

найдет сообщение, а вызов @message.user сделает еще один SQL-запрос (он же ленивая загрузка).

Если вы посмотрите на фактические SQL-запросы, отправляемые на сервер, вы увидите, что вы зараженывыборка пользователя в первом примере.

Причина, по которой он не отображается, заключается в том, что при проверке @message он просто показывает сообщение, а не вызов to_json, который вызывает проверку user.

3 голосов
/ 14 мая 2013

Этот синтаксис работает с рельсами 4.

Message.includes(:user).find(1)
3 голосов
/ 25 апреля 2011

Он включен, поэтому, если вы вызываете это:

@message = Message.find(1, :include => :user)
@message.user

Второй запрос не будет выполнен, поскольку пользователь уже загружен, в то время как

@message = Message.find(1)
@message.user

выполнит оба запроса

И полезный скринкаст, чтобы понять, что происходит

http://railscasts.com/episodes/22-eager-loading

2 голосов
/ 25 апреля 2011

Включено в запрос SQL. Когда вы позвоните Message.find(1, :include => :user).user, запрос для этого не будет выполнен. Все данные загружаются в одном запросе SQL.

Смотреть журнал приложений на наличие доказательств (tail -f log/development.log).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...