我目前有一个有效的Active Record协会,但我想知道是否有更有效的方法来做这样的事情。基本上我有一个名为Task的模型。任务有一个创建者,可以分配给很多人。用户模型是名为User的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
基础知识任务必须具备:
解决方案
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
答案 0 :(得分:0)
我不会以这种方式使它复杂化,而是在任务表中放入created_by列
class Task < ActiveRecord::Base
has_and_belongs_to_many :users
end
class User < ActiveRecord::Base
has_and_belongs_to_many :tasks
def user_created_tasks
tasks.select { |x| x.created_by == id }
end
end
或类似的东西,以便用户找到任务
答案 1 :(得分:0)
has_many
接受一个where子句,您可以使用该子句来进一步确定关系的范围:
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'
has_many :tasks, ->(user) { joins(:users).where('users.id = ? OR tasks.creator_id = ?', user.id, user.id) }
end
..然后@user.tasks
应该为您提供由给定用户分配和创建的所有任务。
答案 2 :(得分:0)
快速执行此操作的方法是:
class User
def associated_tasks
Task.joins(:user).joins("LEFT JOIN user_tasks ON user_tasks.task_id = tasks.id").where("users.id = :user_id OR user_tasks.user_id = :user_id", { user_id: id }).includes(project: [:client])
end
end
请注意,我们LEFT JOIN
任务和用户之间的联接表,我称之为user_tasks
,您应该可以替换其他人。
还有其他方法可以做到这一点;当我有时间时,我会更新答案以包含这些内容。