簡體   English   中英

Rails基於缺少條件的關聯模型來查詢一個模型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM