[英]rails active record query for 2 attributes listed together
我想创建一个索引任务站点,并想在同一个列表中列出所有任务(模型中的传入称为已执行的任务,模型中称为已分配的任务),基于 created_at 混合。 使用以下代码,我可以为传入和传出任务创建 2 个单独的列表,但看起来不太好。 我什至不确定是否应该对模型、控制器或视图进行一些更改。
任务文件
belongs_to :assigner, class_name: "User"
belongs_to :executor, class_name: "User"
用户名
has_many :assigned_tasks, class_name: "Task", foreign_key: "assigner_id"
has_many :executed_tasks, class_name: "Task", foreign_key: "executor_id"
任务控制器.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
<div class= "container">
<div class = "row">
<% @assigned_tasks.each do |task| %>
<% unless task.completed? %>
<%= link_to user_task_path(id: task.id) do %>
<%= task.name %>
<% end %>
<%= task.content %>
<%= task.executor.profile.first_name %>
<% end %>
<% end %>
<br />
<br />
<% @executed_tasks.each do |task| %>
<% unless task.completed? %>
<%= link_to user_task_path(id: task.id) do %>
<%= task.name %>
<% end %>
<%= task.content %>
<%= task.assigner.profile.first_name %>
<% end %>
<% end %>
</div>
</div>
在您的用户模型中添加一个方法,该方法将从两个范围(assigned_tasks 和 excuted_tasks)返回组合结果。
用户名
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
任务控制器.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 %>
希望这有帮助。
也许您可以向用户模型添加一个方法。
用户名
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 ,数据库可以负责检索和排序记录......
上面的语法没有经过全面测试,但希望能给你一些有用的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.