Sql 如何从Rails中的数据库中选择ID不同的记录?

Sql 如何从Rails中的数据库中选择ID不同的记录?,sql,ruby-on-rails,ruby-on-rails-4,distinct,Sql,Ruby On Rails,Ruby On Rails 4,Distinct,我试图选择不同的记录来填充select标记,我需要查询中的ID,但当我编写这样的查询时: Topic.select(:name).distinct #<ActiveRecord::Relation [#<Topic id: nil, name: "Ruby">, #<Topic id: nil, name: "Python">, #<Topic id: nil, name: "tingz">, #<Topic id: nil, name: "Ja

我试图选择不同的记录来填充select标记,我需要查询中的ID,但当我编写这样的查询时:

Topic.select(:name).distinct
#<ActiveRecord::Relation [#<Topic id: nil, name: "Ruby">, #<Topic id: nil, name: "Python">, #<Topic id: nil, name: "tingz">, #<Topic id: nil, name: "Javascript">, #<Topic id: nil, name: "Java">]>
它返回的结果如下所示:

Topic.select(:name).distinct
#<ActiveRecord::Relation [#<Topic id: nil, name: "Ruby">, #<Topic id: nil, name: "Python">, #<Topic id: nil, name: "tingz">, #<Topic id: nil, name: "Javascript">, #<Topic id: nil, name: "Java">]>
为了让select下拉列表正常工作,我还需要返回相应的ID

这是我在视图中使用的选择标记:

<%= select_tag :topic_search, options_from_collection_for_select(Topic.select(:name).distinct, :id, :name), placeholder: "Select topic" %>
有人知道这样做的最佳方式是什么吗?

对于Rails 4.x,使用

Topic.select(:id, :name).distinct
注:

在评论中回答您的问题,即:

如果输入了相同的名称,则仍然返回重复值的Nope 两次


你不能那样做。假设在两条记录中有Python,那么它们将有两个不同的IDS作为主键。在这种情况下,您将为不同的Python映射哪个id我想您需要:

Topic.select('distinct on(name) id, name').order(:name)

刚刚发现解决此问题的一种方法是不使用Rails助手:

options_from_collection_for_select
而是使用:

options_for_select
并将如下所示的查询语句传入选项\u for\u select:

<%= select_tag :topic_search, options_for_select(Topic.uniq.pluck(:name)), prompt: "Select topic" %>

通过这种方式,您可以传入一个数组,而不必担心获取唯一id的问题,因为如果两次输入相同的名称,该id仍然会返回重复值,但您不能这样做。假设在两条记录中有Python,那么它们将有两个不同的IDS作为主键。在这种情况下,你会为不同的Python映射哪个id?@vee对我的上述评论有何想法。@KirtiThorat,当然,我会在示例中使用Jack和Jill:我建议在rails 4中提及,因为语法在rails 3中不起作用,还有一个庞大的Rails 3用户群。@vee感谢您确认:更新了我的答案您使用的是什么版本的Rails?distinct中使用的是什么?从未见过sqlite3,也没有使用过它。@maniek很酷的回答,我自己回答了这个问题,但我更喜欢你的回答@这是一种后希腊主义。基本上,取给定名称的第一个id。