私は常に、複数の関連付けられたモデルに基づいてクエリを実行したり、関連付けられたモデルがないことに基づいてクエリを実行したりするときに問題を抱えていました。
そのため、特定のユーザーごとにメッセージを既読または未読としてマークする方法を実装しようとしています。これらは私が取り組んでいるモデルです:
class Stock < ActiveRecord::Base
has_many :messages
end
class Message < ActiveRecord::Base
belongs_to :stock
has_many :message_viewings
end
class MessageViewing < ActiveRecord::Base
belongs_to :user
belongs_to :message
end
class User < ActiveRecord::Base
has_many :message_viewings
end
私の目標は、特定のユーザーによる MessageViewings を欠いているメッセージを持つすべての株式を見つけることです。未読メッセージがあるかどうかをユーザーに示すことができるように、この情報が必要です。これまでのところ、言及する価値のある試みはありません。
アップデート
さらに検索すると、うまく文書化された宝石にたどり着きました。そこにリストされているクエリを少し変更して、この新しいクエリにたどり着きました。これは、私がやりたいことを実現しているように見えますが、それがどれほど効率的であるかはわかりません。
Stock.joins(:messages).joins("LEFT JOIN message_viewings ON \
message_viewings.message_id = messages.id AND \
message_viewings.user_id = #{User.sanitize(current_user.id)}").where(
"message_viewings.id IS NULL")