Как я создаю значение по умолчанию для атрибутов в модели activerecord's направляющих? [дубликат]

Из-за Набора Поколений я должен был бы сказать, что трассировка и копирование не огромные узкие места к GC.

то, Что помогло бы, помогается с аппаратными средствами барьеры ЧТЕНИЯ, которые устраняют потребность в 'остановке мировые' паузы при выполнении сканирований стека и маркировке "кучи".

Azul Systems сделал это: http://www.azulsystems.com/products/compute_appliance.htm Они дали презентацию в JavaOne о том, как их модификации оборудования допускали абсолютно бесконечный GC.

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

GCs Поколений, и еще больше для G1 или Мусора Сначала, уменьшают сумму "кучи", которую они должны просканировать, только сканируя раздел и сохраняя список помнивших наборов для указателей перекрестного раздела.

проблема, это означает ЛЮБОЕ время, мутатор (необычное слово для 'реальной программы') устанавливает указатель, это также должно поместить запись в соответствующий набор rememered. Таким образом, у Вас есть (маленькие) издержки, даже когда Вы не GCing. Если бы можно уменьшить это, Вы уменьшили бы и времена паузы, необходимые для GCing и полную производительность программы.

190
задан KARASZI István 7 October 2011 в 03:34
поделиться

4 ответа

Вы можете установить параметр по умолчанию для столбца в миграции

....
add_column :status, :string, :default => "P"
....

ИЛИ

Вы можете использовать обратный вызов, before_save

class Task < ActiveRecord::Base
  before_save :default_values
  def default_values
    self.status ||= 'P' # note self.status = 'P' if self.status.nil? might be safer (per @frontendbeauty)
  end
end
287
ответ дан 23 November 2019 в 05:35
поделиться

You can do it without writing any code at all :) You just need to set the default value for the column in the database. You can do this in your migrations. For example:

create_table :projects do |t|
  t.string :status, :null => false, :default => 'P'
  ...
  t.timestamps
end

Hope that helps.

77
ответ дан 23 November 2019 в 05:35
поделиться

Решение зависит от нескольких вещей.

Зависит ли значение по умолчанию от другой информации, доступной во время создания? Можете ли вы стереть базу данных с минимальными последствиями?

Если вы ответили на первый вопрос «да», тогда вы хотите использовать решение Джима

Если вы ответили на второй вопрос «да», тогда вы хотите использовать решение Дэниела

. ответили нет на оба вопроса, вероятно, вам лучше добавить и запустить новую миграцию.

class AddDefaultMigration < ActiveRecord::Migration
  def self.up
     change_column :tasks, :status, :string, :default => default_value, :null => false
  end
end

: строка может быть заменена любым типом, который распознает ActiveRecord :: Migration.

CPU дешев, поэтому переопределение Task в решении Джима не вызовет много проблем. Особенно в производственной среде. Эта миграция - правильный способ сделать это, поскольку она загружается и вызывается гораздо реже.

22
ответ дан 23 November 2019 в 05:35
поделиться

Я нашел способ получше чтобы сделать это сейчас:

def status=(value) 
  self[:status] = 'P' 
end 

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

0
ответ дан 23 November 2019 в 05:35
поделиться
Другие вопросы по тегам:

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