четверг, 26 августа 2010 г.

Оптимизация миграций(перевод)

Миграции, по моему мнению, одна из лучших вещей в рельсе.
Но что пользоваться максимально эффективно следует придерживаться след правил.


1. Индексы базы данных
В первую очередь определите индексы для всех внешних ключей и для всех колонок которые вы будете сортировать, по которым будете искать и группировать.
class CreateInvoices ActiveRecord::Migration
  def self.up
    create_table :invoices do |t|
      t.integer :number
      t.integer :year
      t.decimal :total_amount
      t.date :invoice_date
      t.integer :company_id
      t.integer :client_id
      t.timestamps
    end
  end
  def self.down
    drop_table :invoices
  end
end

Это обычная миграция генерируемая стандартной script/generate коммандой.
Теперь добавим индексы для сортируемых полей и ключей.

class CreateInvoices ActiveRecord::Migration
  def self.up
    create_table :invoices do |t|
      t.integer :number
      t.integer :year
      t.decimal :total_amount
      t.date :invoice_date
      t.integer :company_id
      t.integer :client_id
      t.timestamps
    end
  end
  add_index :invoices,:company_id
  add_index :invoices,:client_id
  add_index :invoices,:number
  add_index :invoices,:year
  def self.down
    drop_table :invoices
  end
end

Индексы важны для производительности.
База начинает летать по сравнению со стандартной миграцией.
Есть несколько плагинов которые будут полезны для вашей базы.
* http://github.com/eladmeidar/rails_indexes
* http://github.com/mlomnicki/automatic_foreign_key
* http://github.com/samdanavia/ambitious_query_indexer


2. Пишите сиды.
Начиная с рельсы 2.3.4 вместо того что б вписывать данные в миграции - пишите их в seed.rb
Обращаю внимание - фикстуры для тестов,сиды для продакшена(содержит данные без которых нельзя стартануть- например список странн или список станций метро)

обход callback в рельсе

1: не в курсе как обновить атрибуты и сохранить модельку без валидации?
2: u.attributes = {:tt => 12, :yu => 78} u.save(false)
1: пасиба, а не в курсе как избежать before/after коллбеков?
2: вроде как то отключать можно
1: @user_profile.send(:update_without_callbacks)

понедельник, 2 августа 2010 г.

обход callback в рельсе

1: не в курсе как обновить атрибуты и сохранить модельку без валидации?
2: u.attributes = {:tt => 12, :yu => 78} u.save(false)
1: пасиба, а не в курсе как избежать before/after коллбеков?
2: вроде как то отключать можно
1: @user_profile.send(:update_without_callbacks)