分配和创建的活动记录关系

时间:2016-07-01 13:41:24

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord devise

我目前有一个有效的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

3 个答案:

答案 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,您应该可以替换其他人。

还有其他方法可以做到这一点;当我有时间时,我会更新答案以包含这些内容。