我想创建一个索引任务站点,并希望在同一个列表中列出所有任务(模型中的传入名为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>
答案 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,数据库可以负责检索和排序记录......
上面的语法没有经过全面测试,但希望能为您提供一些工具。