Использование include / joins - PullRequest
2 голосов
/ 17 ноября 2009

У меня есть модель предложения и модель подписи.

В предложении много подписей, и подпись принадлежит предложению

Мои отношения работают нормально, когда я выбираю одно предложение, но когда я делаю Proposal.search и возвращаю несколько предложений, я не могу получить доступ к подписи.

Я хочу отсортировать свои предложения по количеству подписей, поэтому я попробовал это:

Proposal.find(:all, :limit => 3, :include => [:signatures])

Теперь, когда я отлаживаю (@proposals), я вижу соответствующие подписи. Как получить к ним доступ и написать: order => signatures.count?

Я не очень знаком с включениями / соединениями ... поэтому дайте мне знать, если я поступаю неправильно. Спасибо.

Ответы [ 3 ]

2 голосов
/ 17 ноября 2009

Чтобы познакомиться с использованием включений и объединений, взгляните на Railscast , который посвящен этому. Причина, по которой вы не можете заказать по signatures.count, заключается в том, что вы не выбираете столбец (или виртуальный столбец), содержащий эту информацию.

Вам понадобится комбинация: select и: join, чтобы получить то, что вы хотите.

1 голос
/ 17 ноября 2009

:include используется, когда вам понадобится получить доступ к подписи позже. Если все, что вам нужно, это количество связанных подписей для сортировки, то вам не нужно :include.

Мне не особенно нравится следующее, но, похоже, оно работает:

Proposal.find(:all,
              :limit => 3,
              :joins => :signatures,
              :group => 'proposals.id',
              :order => 'count(proposals.id) desc')

Во-первых, параметр :joins означает, что для каждой записи Предложения вы получите еще одну строку в выходных данных для каждой связанной Подписи. Параметр :group объединяет эти строки в одну, но только после сортировки параметра :order на основе количества строк для каждого offer.id (и, следовательно, количества подписей).

Я подозреваю, что есть лучший способ, но, похоже, это работает.

1 голос
/ 17 ноября 2009

Я бы предложил использовать функцию ActiveRecord counter cache . Добавьте поле signatures_count в вашу модель предложения, и тогда вы сможете сделать заказ:

Proposal.find(:all, :limit => 3, :include => [:signatures], :order => 'signatures_count DESC')

Для получения более подробной информации ознакомьтесь с документацией на API для принадлежащих_связей, ссылки на которую приведены выше. На этом здесь .

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