我正在尝试创建一个下拉列表来过滤表格中的结果。到目前为止,除了列出多个项目外,一切正常。
如:
Clec ID:
216 324
216 315
我只想要一个216.
<select name="by_clecid">
<option value="">All</option>
<% @task_queues.each do |task_queue| %> <option value="<%= task_queue.clecid %>"><%= task_queue.clecid %></option><% end %>
</select>
我以为我可以使用.group但不确定如何使用它。非常感谢任何帮助我对Ruby不是很熟悉。
编辑: 模特:
class TaskQueue < ActiveRecord::Base
require 'task_queue'
self.table_name = "taskqueue"
belongs_to :clec_profile
scope :by_status, -> status { where(:status => status) }
scope :by_tasktype, -> tasktype { where(:tasktype => tasktype) }
scope :by_clecid, -> clecid { where(:clecid => clecid) }
scope :by_taskid, -> taskid { where(:taskid => taskid) }
scope :by_hostname, -> hostname { where(:hostname => hostname) }
def elapsed_seconds
case status
when "Completed"
finishtime - starttime
when "Pending"
Time.now - starttime
when "Waiting", "Failed"
0
end
end
end
一些控制器:
class TaskQueuesController < ApplicationController
before_action :set_task_queue, only: [:show, :edit, :update, :destroy]
has_scope :by_status, :by_tasktype, :by_taskid, :by_hostname, :by_clecid
def index
@task_queues = apply_scopes(TaskQueue).all
@task_queues = @task_queues.paginate(:page => params[:page], :per_page => 30)
end
end
编辑: 这是一张图片,可以更好地展示正在发生的事情:http://i.imgur.com/SQZZDXC.png 我会把它显示为图像,但还没有足够的代表。
答案 0 :(得分:2)
ActiveRecord提供uniq
方法来生成SELECT DISTINCT ...
查询。你可以做例如
@clec_ids = apply_scopes(TaskQueue).uniq.pluck(:clecid)
如果您想重新使用已选择的@task_queues
,则可以使用表兄弟方法Array#uniq
来确保仅显示唯一的clecid
@clec_ids = @task_queues.map(:clecid).uniq
在你看来,你会做
<select name="by_clecid">
<option value="">All</option>
<% @clec_ids do |clec_id| %>
<option value="<%= clec_id %>"><%= clec_id %></option>
<% end %>
</select>
答案 1 :(得分:1)
暂时忽略一些代码,你真正想做的只是从数据库中提取一个可能的clec_id
值列表。为此,ActiveRecord
提供pluck
:
@clec_ids = ClecProfile.pluck(:id) #=> [1,2,3,4,5,...]
# alternately...
@clec_ids = TaskQueue.clec_profiles.pluck(:id).uniq #=> [1,2,3,4,5,...]
我认为uniq
现在不适合你的原因是你正在查看多个不唯一的关联对象,只是它们的ID。使用pluck
获取一组id而不是实例化的ActiveRecord对象可以回避这个问题。