rails有效记录查询一起列出的2个属性

我想创建一个索引任务站点,并希望在同一列表中列出所有任务(模型中的传入名为execu_tasks和模型中的传出名为assigned_tasks),基于created_at进行混合。 使用以下代码,我可以为传入和传出任务创建彼此之间的2个单独列表,但看起来不太好。 我甚至不确定是否应该在模型,控制器或视图中进行一些更改。

task.rb

belongs_to :assigner, class_name: "User" belongs_to :executor, class_name: "User" 

user.rb

 has_many :assigned_tasks, class_name: "Task", foreign_key: "assigner_id" has_many :executed_tasks, class_name: "Task", foreign_key: "executor_id" 

tasks.controller.rb

 def index @user = current_user @assigned_tasks = @user.assigned_tasks.order("created_at DESC") @executed_tasks = @user.executed_tasks.order("created_at DESC") end 

任务/ index.html.erb

 


在User模型中添加一个方法,该方法将返回范围(assigned_tasks和excuted_tasks)的组合结果。

User.rb

  def tasks tasks = assigned_tasks.uncompleted.order("created_at DESC") tasks += executed_tasks.uncompleted.order("created_at DESC") tasks.sort_by { |h| h[:created_at] }.reverse! end 

tasks.controller.rb

 def index @user = current_user end 

视图

 <% @user.tasks.each do |task| %> .. .. <% end %> 

我会在UserUser一个返回关系的组合查询方法。 这样,您可以使用其他范围,或合并到连接中。

 class User < ActiveRecord::Base has_many :assigned_tasks, class_name: "Task", foreign_key: "assigner_id" has_many :executed_tasks, class_name: "Task", foreign_key: "executor_id" def associated_tasks Task.where('tasks.assigner_id = ? OR tasks.executer_id = ?', id, id) end end user = User.first tasks = user.associated_tasks 

或者,您可以在Task上创建范围:

 class Task < ActiveRecord::Base belongs_to :assigner, class_name: "User" belongs_to :executor, class_name: "User" scope :associated_with_user, (u) -> { where('tasks.assigner_id = ? OR tasks.executer_id = ?', u.id, u.id) } end user = User.first tasks = Task.associated_with_user(user) 

您可以根据已分配和已执行的任务创建数组,并按created_at对其进行排序。 像这样的东西:

 tasks = [] tasks << @assigned_tasks tasks << @expired_tasks @tasks = tasks.sort_by { |c| c[:created_at]}.reverse 

在你看来:

 <% @tasks.each do |task| %> .... <% end %> 

希望这个帮助。

也许您可以向用户模型添加方法。

user.rb

 def tasks Task.find_by_sql ["SELECT tasks.* FROM tasks WHERE assigner_id = ? OR executor_id = ? order by created_at DESC", self.id, self.id] end 

您的控制器可能如下所示:

 def index @user = current_user @all_tasks = @user.tasks @assigned_tasks = @user.assigned_tasks.order("created_at DESC") @executed_tasks = @user.executed_tasks.order("created_at DESC") end 

然后你可以在你的视图中调用user.tasks,数据库可以负责检索和排序记录……

上面的语法没有经过全面测试,但希望能为您提供一些帮助。