Rails创建重复记录的范围

时间:2016-03-31 17:34:46

标签: ruby-on-rails activerecord

如果您需要在课程中按名称提取所有重复项,则可以通过以下方式实现:

Company.select(:name).group(:name).having("count(*) > 1")

如果你想在范围内做什么怎么办

scope :duplicates, -> { where (...?)}

另外,作为回报,我不仅需要几个字段名称。有没有人有同样的问题来创建一个范围?

2 个答案:

答案 0 :(得分:1)

您需要在两个查询中运行它。第一个查询选择重复的名称,第二个查询选择具有重复名称的记录并使用current_scope,以便在需要时可以使用更多范围链接(不幸的是{{1} }似乎是一个非常有用但undocumented方法):

current_scope

scope :duplicates, -> { dup_names = Company.group(:name).having("count(*) > 1").pluck(:name) current_scope.where(name: dup_names) } 变量将包含在公司中找到的重复名称数组。)

然后,您可以轻松地在重复记录上添加更多条件,例如:

dup_names

将只选择名称以' a'开头的两家公司。 (并且具有重复的名称)。

答案 1 :(得分:0)

由于

scope :red, -> { where(color: 'red') }

只是用于定义实际类方法的“语法糖”:

class Shirt < ActiveRecord::Base
  def self.red
    where(color: 'red')
  end
end

你可以像这样定义范围:

scope :duplicates, -> { ids = select(:id).group(:name).having("count(name) > 1"); where(id: ids) }