Переопределить delete_all в рельсах - PullRequest
2 голосов
/ 20 января 2011

Я хочу добавить :limit предложение к delete_all... как я могу это сделать?

Один из способов, который я могу придумать, это переопределить значение по умолчанию delete_all, но я не могу заставить его работать... функция add_conditions! не определена!

Ответы [ 2 ]

4 голосов
/ 20 января 2011

Нет необходимости переопределять что-либо:

# Rails 2
SomeModel.scoped(:limit => 10).destroy_all

# Rails 3
SomeModel.limit(10).destroy_all

Редактировать: Передача спецификации:

it "should destroy all using scope" do
  10.times { SomeModel.create }
  expect {
    SomeModel.limit(5).destroy_all
  }.to change(SomeModel, :count).by(-5)
  SomeModel.count.should == 5
end
1 голос
/ 25 августа 2011

Это работало с mysql и rails 2.3

# in config/initializers/active_record_extensions.rb
class ActiveRecord::Base
  # like delete_all, but honors limit (either through scope ar as a option)
  def self.delete_all_limit(conditions = nil, limit=nil, offset=nil)
    scope = scope(:find)
    sql = "DELETE FROM #{quoted_table_name} "
    add_conditions!(sql, conditions, scope)
    add_limit!(sql, {:limit => limit, :offset => offset}, scope)
    connection.delete(sql, "#{name} Delete all limited")
  end
end

и еще более уродливым хаком для oracle_enhanced adpater.(Я предполагаю, что это лучше с рельсами3)

# in config/initializers/active_record_extensions.rb

module ActiveRecord
  class Base
    # like delete_all, but honors limit and offset (either through scope ar as a option)
    def self.delete_all_limit(conditions = nil, limit=nil, offset=nil)
      scope = scope(:find)
      q = self
      limit ||= scope[:limit] if scope

      if limit
        limit = limit.to_i
         q = q.scoped(:conditions => "rownum <= #{limit}")
      end

      return q.delete_all(conditions)
    end
  end
end
...