繁体   English   中英

通过HABTM关联属性查询模型

[英]Querying model by attribute of HABTM association

我在用户和对话这两个模型之间有一个 HABTM 关联。 我希望能够查询登录用户的对话( current_user.conversations ),将另一个用户的 id 传递给它,并让它返回一个由两个用户共享的对话(如果存在)。 (一个额外的好处是让查询在不存在的情况下创建一个。)

关联工作正常,因此我可以通过@user.conversations@conversation.users等实例变量访问关联对象,因此我可以走很长的路,遍历每个对话对象并搜索每个对象中的用户关联。 .. 但是必须有一种有效的方法来构造这个查询。 我希望能够做的是类似current_user.conversations.where(conversation.users.exists?(id: @user_id))或类似Conversation.find(users: {id: @user_id AND current_user.id})

我想对此有一个明显的答案,我一直在这里寻找类似的问题,但没有找到。 在浏览了 Rails API 文档后,我想我正在寻找的解决方案以某种方式涉及.includes() ,但我无法让它工作。

有什么建议吗? 谢谢。

假设你有两个用户@sender@receiver ,并有一个(或可能更多),他们之间的对话。 查询他们共享对话的一种可能方法是使用 ActiveRecord 中的merge功能。 merge将选择它们之间对话的交集:

@shared_conversations = @sender.conversations.merge(@receiver.conversations)

请注意,结果将是一个集合,而不是单个对话。 在 SQL 中,这将转换为INNER JOIN

如果您想修改此查询以创建不存在的对话,则可以使用first_or_create 顾名思义, first_or_create返回集合中的第一项。 如果集合为空,它将创建一个新对象。 您可以向它传递一个块以进一步控制新创建的对象:

@shared_conversations = @sender.conversations.merge(@receiver.conversations).first_or_create do |conversation|
  conversation.title = "#{@sender.first_name}'s conversation"
end

您可以在 Rails 文档中找到有关merge更多详细信息: http : //apidock.com/rails/ActiveRecord/SpawnMethods/merge

尝试 current_user.conversations.includes(:users).where(user.id:current_user.id)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM