Использование: включить заявление, чтобы найти записи - PullRequest
0 голосов
/ 17 февраля 2010

Я работаю над Ruby On Rails 2.3.2 и изучаю, как использовать оператор: include.

Я бы хотел получить все объявления по их ставке. У меня есть две модели и таблицы для этого: Объявление и Оценить.

Модели выглядят так:

 class Announcement <
 ActiveRecord::Base

   belongs_to :rate

 end

 class Rate < ActiveRecord::Base

   belongs_to :announcement

end

Я бы хотел сделать что-то вроде следующего, но используя: include оператор.

Announcement.find_by_sql 'select * from announcements ann inner join rates r on ann.id = r.announcement_id order by r.average DESC'

Я уже пробовал это:

Announcement.paginate :page => params[:page], :per_page => 10, :include => [:rates], :order => 'rates.average DESC'

но пытается связать rates.id = announcements.id вместо rates.announcement_id = announcement_id

Как мне указать правильные отношения, чтобы сделать эту работу?

1 Ответ

1 голос
/ 17 февраля 2010

Как отмечает Юрий в комментариях, вы неправильно определили свои отношения.

Объявления должны have_one :rate

В качестве именованной области при объявлении:

class Announcement < ActiveRecord::Base

  has_one :rate
  named_scope :order_by_rate, :include => :rate, :order => 'rates.average DESC'

end

Announcement.order_by_rate.paginate :per_page => 10, :page => params[:page]

Обратите внимание на разницу между :include и :joins в качестве параметра поиска.: объединения объединяют фрагмент (ы) ассоциации или фрагмент SQL JOIN, заданный для сложных предложений WHERE / ORDER.: include будет работать только с ассоциациями, он обеспечивает те же преимущества, что и: объединения, а также позволяет загружать ассоциации.

Если стремление к загрузке имеет значение:

С помощью include, @ a.rate заполняется тем же оператором SQL, который заполняет @ a.

@a = Association.first :include => :rate

Без include @a.rate не заполняется, пока не потребуется.

@a = Association.first
@a.rate #=> @a.rate is populated here, with a separate SQL statement.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...