collection_select优雅的“select distinct”

时间:2010-01-07 14:00:48

标签: ruby-on-rails

我对RoR很新,并且攻击一个小应用程序。为了显示表单中某些模型列的现有值,我目前这样做:

<% form_for([@testbox, @testitem]) do |f| %>
  <%= f.label :sortkey %><br />
  <%= f.collection_select :sortkey, Testitem.groups , :sortkey, :sortkey, {:include_blank => true}  %>
<% end %>

Testitem模型中,我有:

def Testitem.groups
  return find_by_sql("SELECT DISTINCT sortkey from testitems; ")
end

我相信这有更优雅的解决方案吗?我尝试过find(:all).sortkey.unique,但会抛出undefined method 'sortkey' for #<Array:0x59d1b60>

2 个答案:

答案 0 :(得分:9)

这实现了同样的目的,但我不确定它是否更优雅:

Testitem.find(:all, :select => "DISTINCT sortkey")

答案 1 :(得分:1)

帕特里克罗伯逊的方式可能要快得多。您也可以使用group选项执行此操作:

Testitem.find(:all, :group => "sortkey")

使用:select选项会将DISTICT sortkey放入SQL查询中,而使用:group添加GROUP BY sortkey。我不知道哪一个更快。

你也可以通过返回sortkey的字符串来实现:

Testitem.find(:all).map(&:sortkey).uniq

这可能更慢,因为它将检索所有项目并在Ruby端而不是SQL端进行过滤。