3

我在使用范围内的 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>
4

3 回答 3

7

我认为您将无法选择另一个领域以及Distinct保留其独特性的选择。

我想您可能正在寻找GROUP BY可以在 Rails 中这样使用的方法:

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
于 2012-02-09T09:50:46.360 回答
0

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

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

于 2012-02-09T09:34:59.413 回答
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)

很有魅力

于 2012-02-10T09:35:26.100 回答