Rails范围:选择带有值的不同标题

时间:2012-02-09 09:31:09

标签: ruby-on-rails ruby-on-rails-3 rails-activerecord rails-postgresql

我在范围内遇到SQL查询问题。我需要返回一个独特的Project.titles及其附带的id的集合,以便在表单中使用。

我可以使用

获得不同的标题
scope :unique_title, select("DISTINCT title")

但是我没有在结果选项中获得值

= project_form.input :id, collection: current_user.projects.unique_title

结果:

<select>
  <option value>Item 1</option>
  <option value>Item 2</option>
  <option value>Item 3</option>
</select>

所以,将id添加到我的范围:

scope :unique_title, select("DISTINCT title").select("id")

结果为我提供了值,但现在我的DISTINCT选择已不存在:

<select>
  <option value="1">Item 1</option>
  <option value="2">Item 2</option>
  <option value="3">Item 3</option>
  <option value="4">Item 2</option>
  <option value="5">Item 2</option>
  <option value="6">Item 2</option>
</select>

3 个答案:

答案 0 :(得分:7)

我认为您无法选择其他字段以及Distinct选择保留其独特性。

我认为您可能正在寻找可以在Rails中使用的GROUP BY

scope :unique_title, select("id, title").group("title")

但是,这将只选择具有相同标题的组中的第一个。如果您想要所有记录但需要根据标题对它们进行分组,则需要获取所有记录,然后将它们从Ruby中分组。

scope :titles, select("id, title")

然后你使用范围,你sh:

Model.titles.all.group_by(&:title).each do |distinct_title, records|
  # do something with the distinct title and records having that distinct title
end

答案 1 :(得分:0)

我还没有完成SQL一段时间,所以这可能不会这样做,但我会选择.select("id, title DISTINCT)

PS:如果您使用的是Rails 3.2,可以使用explain查看实际使用的查询(至少我认为你可以,还没有尝试过) ,以及为什么它不能按预期工作。

答案 2 :(得分:0)

我采取了不同的方法来解决这个问题。

我的项目模型上的新专栏

$ rails g migration add_template_to_project template:boolean

添加到模型

before_create :check_if_exists

def check_if_exists
  toggle!(:template) if title.exists?
end

然后范围可以是:

scope :unique_title, select("id, title").where(template: true)

运作魅力