Не смотрите на него от аспекта того, какие шаблоны использовать с Вашим подходом к разработке, но посмотреть на него больше как, как применить шаблоны на основе проблемы проблемой. Архитектурные решения, принятые для проекта, обеспечивают такой же признак того, какие шаблоны использовать, поскольку опыт других людей продиктует.
Однако я нашел, что я - поклонник модели Provider для того, чтобы иметь разнообразный выбор выполнить единственную задачу с простотой включенного развертывания. Кроме того, шаблон Единицы работы является большим для установки транзакционных границ. В основном, тем не менее, архитектура и бизнес-потребности диктуют подход, который проявлен для любого данного изменения кода или новой разработки.
так, как я люблю шаблоны, я всегда боюсь, что наблюдение их злоупотребило. Я лично видел людей, которые использовали их только ради использования их, и оно на самом деле сделало код тяжелее для поддержания и более сильно связанный, чем это должно было быть. Кроме того, хорошо знать обе стороны аргумента шаблонов. Хорошее знание шаблона должно быть закруглено с (часто рассматривал шаблон, самостоятельно) антишаблон знание, также.
"Правильный" - опасное слово в Ruby. Обычно есть несколько способов сделать что-либо. Если вы знаете, что вы всегда хотите, чтобы это значение по умолчанию для этого столбца в этой таблице, установить их в файле миграции БД - самый простой способ:
class SetDefault < ActiveRecord::Migration
def self.up
change_column :people, :last_name, :type, :default => "Doe"
end
def self.down
# You can't currently remove default values in Rails
raise ActiveRecord::IrreversibleMigration, "Can't remove the default"
end
end
Поскольку ActiveRecord автоматически обнаруживает свойства вашей таблицы и столбца, это приведет к вызывают установку того же значения по умолчанию для любой модели, использующей его в любом стандартном приложении Rails.
Однако, если вы хотите, чтобы значения по умолчанию устанавливались только в определенных случаях - скажем, это унаследованная модель, которая разделяет таблицу с некоторыми другими - тогда еще один элегантный способ - сделать это прямо в коде Rails при создании объекта модели:
class GenericPerson < Person
def initialize(attributes=nil)
attr_with_defaults = {:last_name => "Doe"}.merge(attributes)
super(attr_with_defaults)
end
end
Затем, когда вы выполните GenericPerson.new ()
, он всегда будет просачиваться в атрибут "Doe" до чел.
Вы можете переопределить конструктор для модели ActiveRecord.
Примерно так:
def initialize(*args)
super(*args)
self.attribute_that_needs_default_value ||= default_value
self.attribute_that_needs_another_default_value ||= another_default_value
#ad nauseum
end
Если вы просто устанавливаете значения по умолчанию для определенных атрибутов модели, поддерживаемой базой данных, я бы подумал об использовании значений столбцов sql по умолчанию - можете ли вы уточнить, какие типы значений по умолчанию вы используете?
Там есть несколько подходов к этому, этот плагин выглядит интересным вариантом.
Вероятно, предложение переопределить новую / инициализацию неполное. Rails будет (часто) вызывать allocate для объектов ActiveRecord, а вызовы allocate не приводят к вызовам инициализации.
Если вы говорите об объектах ActiveRecord, обратите внимание на переопределение after_initialize.
Эти сообщения в блоге ( не мой) полезны:
Значения по умолчанию Конструкторы по умолчанию не вызываются
[Edit: SFEley указывает, что Rails действительно смотрит на значение по умолчанию в базе данных, когда создает экземпляр нового объекта в памяти - я этого не осознавал.]
Если вы имеете в виду объекты ActiveRecord, у вас есть (более) два способа сделать это:
EG
class AddSsl < ActiveRecord::Migration
def self.up
add_column :accounts, :ssl_enabled, :boolean, :default => true
end
def self.down
remove_column :accounts, :ssl_enabled
end
end
Подробнее здесь: http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
EG before_validation_on_create
Подробнее здесь: http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html#M002147