Как сделать заказ в Rails? - PullRequest
       4

Как сделать заказ в Rails?

2 голосов
/ 08 ноября 2010

Я работаю над небольшим движком блога.

Существуют следующие таблицы: Блог и сообщение.

Блог имеет внешний ключ: last_message_id, поэтому я получаю доступ к последнему сообщению вблог по телефону blog.last_message

У меня есть следующий код, чтобы он работал:

class Blog < ActiveRecord::Base  
  belongs_to :last_message, :class_name => "Message"
end

Мне нужно упорядочить блоги по последним сообщениям.Но когда я звоню

blogs.order("last_message.created_at DESC")

Это не работает.Я получаю следующую ошибку:

PGError: ERROR:  missing FROM-clause entry for table "last_message"
ORDER BY  last_messa...

Как я могу заставить ее работать?

ОБНОВЛЕНИЕ

Вот решение:

blogs.joins(:last_message).order("messages.created_at DESC").

Ответы [ 2 ]

3 голосов
/ 08 ноября 2010

Я думаю, что ваша модель не так.См. Рельсы автоматически добавляют 2 атрибута к модели: created_at и update_at.Таким образом, наличие отношений, как вы описываете, является избыточным.Для меня это должно выглядеть так:

#model/blog.rb
class Blog < ActiveRecord::Base
  has_many :messages
end

#model/message.rb
class Message < ActiveRecord::Base
  belongs_to :blog
end

Затем, чтобы получить блоги, упорядоченные по последнему сообщению, вы можете сделать это:

Blog.joins(:messages).order("messages.created_at_desc")

Это, как вы, возможно, заметилидаст вам двойные записи для вашей модели блога.Если это не проблема, продолжайте.Если это так, у вас есть два варианта: сделать each и проверить, видели ли вы блог, если нет, то вы отобразите его.Или вы можете написать свой собственный sql.

1 голос
/ 08 ноября 2010

Вы должны убедиться, что последние сообщения также выбраны, чтобы заставить эту команду порядка работать. \ Так что-то вроде:

blogs.includes(:last_message).order("last_message.created_at desc")
...