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 %>
我会在User
上User
一个返回关系的组合查询方法。 这样,您可以使用其他范围,或合并到连接中。
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,数据库可以负责检索和排序记录……
上面的语法没有经过全面测试,但希望能为您提供一些帮助。