我有兩個模型:Conversation
和Message
。消息belongs_to的對話和交談的has_many消息:急切加載一個有很多關係的最近項目
# conversation.rb
class Conversation < ActiveRecord::Base
has_many :messages
end
# message.rb
class Message < ActiveRecord::Base
belongs_to :conversation
end
我有一個要列出所有對話的界面,但我也希望包括通過渴望與對話相關的「最新」消息 - 上下。
我是否需要在會話和跟蹤最新消息的消息之間創建新的has_one或belongs_to關係?或者有沒有一種方法可以通過使用連接/包含的範圍來完成此操作?
編輯:的問題是,我不希望這個循環的每個迭代要執行一個SQL查詢:
# controller
@conversations = Conversation.all
# view
@conversations.each do |conversation|
most_recent_message = conversation.messages.last
# ...
end
編輯2:我也試着做到以下幾點,不成功。目標是在會話表中添加last_message_id
列,以便引用最後添加的消息。
# migration
add_column :conversations, :last_message_id, :integer
# conversation.rb
belongs_to :last_message, :class_name => 'Message'
# message.rb
after_create :set_last_message_on_conversation
def set_last_message_on_conversation
self.conversation.last_message = self
self.conversation.save!
end
但是,由於創建對話時last_message_id爲空,導致SQL錯誤。 (我希望一切都能發生在一個事務,該交易完成之前,last_message_id將被更新,但我認爲這是一個MySQL/MyISAM的問題,即交易不被使用。)
ActiveRecord::StatementInvalid: Mysql::Error: Column 'last_message_id' cannot be null: INSERT INTO `conversations` (`last_message_id`, `updated_at`, `created_at`) VALUES (NULL, '2011-05-31 16:57:11', '2011-05-31 16:57:11')
看來這是最接近的我會得到,我想!我看到的唯一問題是內存問題,因爲當我只想爲每個對話設置一個對話時,它會加載與對話關聯的所有消息。 – 2011-06-01 19:22:03
如果這確實是一個問題,存儲'last_message_id'可以工作。這個答案顯示了一種方法:http://stackoverflow.com/questions/6008015/how-can-i-sort-my-records-by-average-rating/6025838#6025838 – 2011-06-01 23:01:05