[英]Rails query one model based on the lack of an associated model with conditions
我一直在基於多個關聯模型進行查詢和基於缺乏關聯模型進行查詢時遇到問題。
因此,我正在嘗試實現一種針對每個特定用戶將郵件標記為已讀或未讀的方法。 這些是我正在使用的模型:
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的消息的股票。 我需要這些信息,以便可以向用戶指示他們是否有未讀郵件。 到目前為止,我的嘗試均不值得一提。
更新
進一步的搜索使我找到了一個文檔齊全的寶石,該寶石幾乎完成了我想要的工作: 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")
嘗試類似:
Stock.joins(messages: :message_viewings).where("message_viewings.user_id != ? or message_viewings.user_id is null", current_user.id)
只要確保設置了當前用戶即可。
如果要讓所有沒有message_viewing的股票屬於當前用戶,請執行以下操作:
@user = # code to retrieve user
Stock.joins(:messages).joins("LEFT JOIN message_viewings ON message_viewings.message_id = messages.id").where("message_viewings.user_id != ? OR message_viewings.id IS NULL", @user.id)
我認為您編寫的代碼有誤,因為如果存在message_viewing中的user_id,則message_viewing的ID不會為null。
我可能會將代碼放在股票模型中:
# stock model
def self.join_message_viewings
joins(:messages).joins("LEFT JOIN ... ")
end
def self.unread_by(user_id)
.where("messages_viewings.user_id != ... ", user_id)
end
# query
Stock.join_message_viewings.unread_by(@user.id)
如果願意,可以將最終查詢合並為一種方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.