我有一个申请人模型,它已成为该项目项目所有者和申请人之间的位置或聊天。
我通过使用申请人表中的申请人.用户参考来跟踪申请人。
我通过使用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
您可以像这样加入申请人和项目表并检查用户
applicants =
Applicant
.joins(:project)
.where('applicants.user_id = :id OR projects.user_id = :id', id: current_user.id)
.order(last_message: :desc)