2010-11-08 53 views
2

我正在研究一個小博客引擎。如何在Rails中進行排序?

有以下表格:博客和消息。

博客有一個外鍵: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... 

我該如何讓它工作?

UPDATE

這裏的解決方案:

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

什麼你是指不工作? – shingara 2010-11-08 09:27:52

+0

@shingara,我已更新帖子。 – Alex 2010-11-08 09:33:34

回答

3

我覺得你的模式是錯誤的。請參閱導軌自動將2個屬性添加到模型中:created_atupdate_at。所以像你所描述的那種關係是redondant。對我來說,應該是這樣的:

#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。

+0

你錯過了這個問題。在Alex的數據模型中,他知道每個博客最後的信息。只是爲了避免這個雙重信息問題。 – nathanvda 2010-11-08 09:42:13

+0

我指出它是redondand與created_at - 之後,他做他想做的事。 – 2010-11-08 09:44:20

+0

這是一個很好的觀點。但事情是,我已經有了一些架構。博客has_many:消息和消息belongs_to:博客。我也有LAST_MESSAGE屬性,這就是問題所在。 – Alex 2010-11-08 10:25:03

1

你必須確保最後的消息也已被選中,以使該訂單指揮工作\ 因此,像:

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

我認爲你是在正確的方向。但它仍然返回一個錯誤。我會盡力找到關於「包含」方法的更多信息。 – Alex 2010-11-08 10:23:36

相關問題