我一直在基于多个关联模型进行查询以及基于缺少关联模型进行查询时遇到问题。
因此,我正在尝试实现一种方法来将每个特定用户的消息标记为已读或未读。这些是我正在使用的模型:
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 的所有带有 Messages 的 Stocks。我想要这些信息,这样我就可以向用户表明他们是否有未读消息。到目前为止,我的任何尝试都不值得一提。
更新
进一步的搜索使我找到了一个记录良好的 gem,几乎可以满足我的要求:https ://github.com/ledermann/unread 。获取那里列出的查询并对其进行一些修改,我来到了这个新查询,它似乎可以完成我想要完成的工作,尽管我不确定它的效率如何:
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")