Rails 7,返回具有两个单独条件的活动记录关联,一个在父级中,一个在子级中

问题描述 投票:0回答:1

我有一个申请人模型,它已成为该项目项目所有者和申请人之间的位置或聊天。

我通过使用申请人表中的申请人.用户参考来跟踪申请人。

我通过使用applicant.project.user来跟踪项目所有者,这是项目表中的引用(申请人的父级)。

正如我所说,Applicant 表也有 Messages 的子项,Applicant 本质上是两个用户之间的聊天视图。

使用 Devise 管理用户。

申请人表中要提到的另一个字段是“last_message”字段,每当用户为该申请人记录创建新消息时,该字段就会更新。

我想获取所有用户“聊天”(或申请人)的列表。这既是他们的项目,也是他们的申请人。

我目前正在做这个:

project_messages = []

current_user.projects.each do |project|
  project.applicants.each do |applicant|
    project_messages << applicant
  end
end

@chats = Applicant
  .where(id: (current_user.applicants + project_messages)
  .map(&:id))
  .order(last_message: :desc)

在这里,我获取了 current_user 项目的列表,并将每个申请人(聊天室)添加到一个数组中。然后我将其添加到 current_user.applicants 中。然后我将两者合并在一起作为活动记录关联。

这可行,但我觉得这是一个不好的方法。有人知道更有效的方法吗?

编辑1

添加关联

class Applicant < ApplicationRecord
  belongs_to :project
  belongs_to :user
  has_many :messages, dependent: :destroy
end
class Project < ApplicationRecord
  belongs_to :user
  has_many :applicants, dependent: :destroy
  has_rich_text :description
end
class User < ApplicationRecord
  has_many :projects, dependent: :destroy
  has_many :applicants, dependent: :destroy
  has_rich_text :about

  devise :database_authenticatable, :registerable, :confirmable, :trackable,
         :recoverable, :rememberable, :validatable
end
class Message < ApplicationRecord
  belongs_to :applicant
end
ruby-on-rails ruby devise rails-activerecord ruby-on-rails-7
1个回答
0
投票

您可以像这样加入申请人和项目表并检查用户

applicants =
  Applicant
    .joins(:project)
    .where('applicants.user_id = :id OR projects.user_id = :id', id: current_user.id)
    .order(last_message: :desc)
© www.soinside.com 2019 - 2024. All rights reserved.