繁体   English   中英

对列出的 2 个属性的 rails 活动记录查询

[英]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 %>

我会在返回关系的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 %>

希望这有帮助。

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

用户名

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM