rails {1}列出的2个属性的活动记录查询

时间:2015-09-16 15:41:35

标签: ruby-on-rails database activerecord model-view-controller rails-activerecord

我想创建一个索引任务站点,并希望在同一个列表中列出所有任务(模型中的传入名为executed_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

<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>

4 个答案:

答案 0 :(得分:1)

在用户模型中添加一个方法,该方法将返回范围(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 %>

答案 1 :(得分:1)

我会在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)

答案 2 :(得分:0)

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

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

并在您看来:

<% @tasks.each do |task| %>
  ....
<% end %>
希望这有帮助。

答案 3 :(得分:0)

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

user.rb

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

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

   <ImageView
       android:id="@+id/icon"
       android:layout_width="30dp"
       android:layout_height="30dp"
       android:layout_marginLeft="22dp"
       android:layout_marginRight="20dp"
       android:adjustViewBounds="true"
       android:scaleType="fitCenter" />



   <TextView
       android:id="@+id/title"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:textColor="#848484"
       android:textSize="15dp" />

   <TextView
       android:id="@+id/textABC"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="TextView" />

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

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