現在、私はアクティブレコードの関連付けを行っていますが、もっと効率的な方法があるかどうかは疑問でした。基本的にはTaskというモデルがあります。タスクには作成者が1人あり、多くの人に割り当てることができます。ユーザーモデルは、ユーザーと呼ばれるDeviseモデルです。これは私の現在の設定ですが、作成したのか、割り当てられたのかにかかわらず、ユーザーのすべてのタスクをフェッチするために使用する必要があるクエリは嫌いです。ここに私のモデルです。私の現在のセットアップはページネーションにもひどいです。助言がありますか?割り当て済みおよび作成済みのアクティブレコードの関係
class Task < ActiveRecord::Base
has_and_belongs_to_many :users
belongs_to :creator, foreign_key: 'creator_id', class_name: 'User'
end
class User < ActiveRecord::Base
has_and_belongs_to_many :assigned_tasks, class_name: 'Task'
has_many :created_tasks, foreign_key: 'creator_id', class_name: 'Task'
def tasks
(assigned_tasks.includes(project: [:client]) + created_tasks.includes(project: [:client])).uniq
end
end
だからbasicsllyタスクを持つことがあります。
- 一つクリエーター(ユーザー)に割り当てられ
- 多くのユーザー
ソリューション
def tasks
Task.joins('LEFT JOIN tasks_users ON tasks_users.task_id = tasks.id').where('tasks_users.user_id = :user_id OR tasks.creator_id = :user_id', { user_id: id }).includes(project: [:client])
end
ユーザーに所属して割り当てられているすべてのタスクをフェッチするために使用されている方法について、まったく気に入らないことについてもう少し詳しく知ることができますか?あなたはそれに関してどんな特別な問題を持っていますか?それは時間がかかりますか?作成するクエリが多すぎますか? – Kyril
@Kyril大変申し訳ありませんが、基本的にはカミナリでこのページングを行いたい場合は難しくなります。その理由は、呼び出し元の2つのテーブル(ジョインと実際のタスクテーブル)と、 'status::open'はタスクの' enum'です。 –
HABTM結合を取り除いて、実際のモデルを使用して、ユーザーをAsssignmentなどのタスク、has_many:tasks、through:assignmentsに参加させることがあります。 – Kris