繁体   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