Rails - Как удалить все записи, кроме одной, которые удовлетворяют условию

Проверьте код за информацией, предоставленной в global.asax. Они должны правильно указывать на класс в своем коде.

sample global.asax:

<%@ Application Codebehind="Global.asax.cs" Inherits="MyApplicationNamespace.MyMvcApplication" Language="C#" %>

образец кода позади:

   namespace MyApplicationNamespace
    {
        public class MyMvcApplication : System.Web.HttpApplication
        {
            protected void Application_Start( )
            {
                AreaRegistration.RegisterAllAreas( );
                FilterConfig.RegisterGlobalFilters( GlobalFilters.Filters );
                RouteConfig.RegisterRoutes( RouteTable.Routes );
                BundleConfig.RegisterBundles( BundleTable.Bundles );
            }
        }
    }
0
задан John Gringus 15 January 2019 в 16:54
поделиться

1 ответ

Согласитесь с действиями, что лучшим подходом будет определение индекса в базе данных для принудительного применения отдельных записей или для добавления в модель валидатора уникальности .

Другой вариант - перехватить вызов метода ActiveRecord create для предотвращения дублирования:

class Example < ApplicationRecord
  def self.create( attributes = nil, &block )
    attributes.each {|attr| self.create(attr, &block) } if attributes.is_a? Array
    return if find_by attributes
    super attributes, &block
  end
end

Основная идея здесь - прервать работу, если вы уже видите запись с такими же значениями атрибута в базе данных. но затем пусть ActiveRecord продолжит выполнять всю тяжелую работу, вызывая его с помощью super.

Если есть ситуация, когда по какой-то причине вы не можете осуществлять контроль над базой данных, чтобы предотвратить ввод дубликатов, вы можете попробовать подход, при котором вы создаете метод класса для периодической очистки дубликатов из системы.

Вот пример метода, который будет выполнять итерацию по всему набору записей и использовать хеш для отслеживания того, видел ли он значения раньше, удаляя их, если так: итак: Example.dedup всякий раз, когда вы хотели очистить дубликаты записей.

Для тех, кто хочет следовать дома, вы можете использовать следующую миграцию:

rails g model example user_id:integer value:string

и начальный файл:

examples = Example.create([
  {user_id: 1, value: 'A'},
  {user_id: 1, value: 'A'},
  {user_id: 1, value: 'A'},
  {user_id: 1, value: 'A'},
  {user_id: 1, value: 'A'},
  {user_id: 1, value: 'A'},
  {user_id: 1, value: 'A'},
  {user_id: 2, value: 'B'},
  {user_id: 2, value: 'B'},
  {user_id: 3, value: 'C'},
])
0
ответ дан Cam 15 January 2019 в 16:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: