ユースケース
私は3つのモデルを持っています:
- a
Message - a
Conversation - a
MessageRecipient
関係は次のように定義されます。
- A
messagehas_and_belongs_to_manyconversations(逆) - あ
messagehas_manymessage_recipients - A
MessageRecipientbelongs_toamessageおよび arecipient(ここでは定義されていません)
動作するケース
方法
@recipient.inbox_conversations.first.messages
次の SQL クエリを作成します。
SELECT *
FROM `messages`
INNER JOIN `conversations_messages`
ON `messages`.id = `conversations_messages`.message_id
WHERE (`conversations_messages`.conversation_id = 2061 )
結果は予想されるメッセージです:
[#<Message id: 7045, ..>]
問題
次のメソッド (前のメソッドとまったく同じで、名前付きスコープが追加されています)
@recipient.inbox_conversations.first.messages.received_by(@recipient)
次の SQL クエリを作成します。
SELECT * FROM `messages`
INNER JOIN `message_recipients`
ON `message_recipients`.message_id = `messages`.id
INNER JOIN `conversations_messages`
ON `conversations_messages`.message_id = `messages`.id
WHERE (`conversations_messages`.conversation_id = 2060 )
AND (`message_recipients`.recipient_id = 32363)
存在しない ActiveRecord 要素を返します
[#<Message id: 9025, ..>]
Message.find_by_id(9025)この行の直後に実行しようとしましたが、これは を返しますnil。
追加のコードが必要ですか?
class Message
named_scope :received_by, lambda { |recipient| {
:conditions => [ "`#{MessageRecipient.table_name}`.recipient_id = ?", recipient.id ],
:joins => "INNER JOIN `#{MessageRecipient.table_name}`
ON `#{MessageRecipient.table_name}`.message_id = `#{Message.table_name}`.id"
} }
.
class Receiver
def inbox_conversations
inbox_messages = Message.received_by(self).find(:all, :include => :conversations)
return inbox_messages.map(&:conversations).flatten.uniq
end
これを読んでくれてありがとう!