Rails选择具有唯一值

时间:2017-09-13 10:25:44

标签: ruby-on-rails select

在视图中我得到了一个模型对象数组:@tasks。任务属于属于公司的项目。对于我的观点,我想创建具有uniq组织名称选项的选择标记。这是我的代码:

 <%= select_tag :organization, options_for_select(@valid_tasks.collect{|t| [ t.project.organisation.name, t.project.organisation.name ]}),include_blank: "", :onchange => "filterTable(this, 'Organization', 'taskInformation')", class: 'form-control pull-right' %>

它有效,但它显示了所有组织的名称,因此我有很多重复项。

@valid_tasks是模型对象模型的数组,它由函数创建:

relevantTasks = []
        userCards.each do |card|
            task = Task.find_by trello_id: card['shortLink']
            if task && task.name && valid_task_name(task.name) && task.label && task.list  && (task.list.upcase != "PRODUCTION") 
                if task.project_id
                    relevantTasks << task
                end
            end 
        end
return relevantTasks

2 个答案:

答案 0 :(得分:1)

对于select标签,我认为您只需在数组对象上调用.uniq

<%= select_tag :organization, options_for_select(@valid_tasks.map {|t| [ t.project.organisation.name, t.project.organisation.name ]}.uniq), include_blank: "", :onchange => "filterTable(this, 'Organization', 'taskInformation')", class: 'form-control pull-right' %>

您还可以使用以下方法改进功能:

userCards.map do |card|
  task = Task.find_by(trello_id: card['shortLink'])
  task if task && task.name && valid_task_name(task.name) && task.label && task.list && (task.list.upcase != "PRODUCTION") && task.project_id
end.compact

请注意我如何移除relevantTasks .map已经返回一个数组。

我不知道你的代码库看起来如何,但我也将valid_task_name(task.name)移动到类方法,如下:

class Task
  # ...more code

  def has_valid_name?
    # Perform task's name validation here
    # and return true or false
  end

  # ...more code 
end

允许您拨打task.has_valid_name?

答案 1 :(得分:0)

执行此操作的最佳方法是必须过滤控制器或模型中的数据。您可以使用ruby uniq方法来过滤数组。

<%= select_tag :organization, options_for_select(@valid_tasks.uniq! {|t| t.project.organisation.name}.collect{|t| [ t.project.organisation.name, t.project.organisation.name ]}),include_blank: "", :onchange => "filterTable(this, 'Organization', 'taskInformation')", class: 'form-control pull-right' %>