如果您設置的關聯正確實在是小巫見大巫:
class User < ApplicationRecord
has_many :recieved_messages, class_name: 'Message', foreign_key: 'recipent_id'
has_many :sent_messages, class_name: 'Message', foreign_key: 'sender_id'
def all_messages
Message.where('recipient_id = :id OR sender_id = :id', id: id)
end
end
class Message < ApplicationRecord
belongs_to :recipient, class_name: 'User', inverse_of: :recieved_messages
belongs_to :sender, class_name: 'User', inverse_of: :sent_messages
def self.between(a,b)
.where('(recipient_id = :id OR sender_id = :id)', id: a)
.where('(recipient_id = :id OR sender_id = :id)', id: b)
end
end
# all messages recieved by the current user:
current_user.recieved_messages.order(created_at: :desc)
# all messages recieved by the current user:
current_user.sent_messages.order(created_at: :desc)
# all messages sent or recieved by the current user:
current_user.all_messages.order(created_at: :desc)
# all messages between two users
Message.between(current_user, some_other_user)
,這是讓用戶之間的任何消息的關鍵是:
WHERE (recipient_id = a OR sender_id = a) AND (recipient_id = b OR sender_id = b)
但你應該考慮創建一個會話模型來加入它們。
調用.last
將按降序排列後得到最早的記錄。如果你想要最新的消息使用.first
爲了避免N + 1查詢問題,請確保您加載相關的記錄:
@messages.eager_load(:recipient, :sender)
當迭代(一個一般)使用的關聯,而不是IDS。千萬別像User.find(message.to_id)
這樣會造成N + 1查詢問題。
<% @messages.each do |message| %>
<p><b><%= message.recipent.name %></b></p>
<p>
<% if message.read? %>
<%= link_to message.content, pm_path(message.recipient) %>
<% else %>
<b><%= link_to message.content, pm_path(message.recipient) %></b>
<% end %>
</p>
<% end %>
來源
2017-10-14 10:59:11
max
Dosent work .... –