Как установить значения по умолчанию в направляющих?

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

Однако я нашел, что я - поклонник модели Provider для того, чтобы иметь разнообразный выбор выполнить единственную задачу с простотой включенного развертывания. Кроме того, шаблон Единицы работы является большим для установки транзакционных границ. В основном, тем не менее, архитектура и бизнес-потребности диктуют подход, который проявлен для любого данного изменения кода или новой разработки.

так, как я люблю шаблоны, я всегда боюсь, что наблюдение их злоупотребило. Я лично видел людей, которые использовали их только ради использования их, и оно на самом деле сделало код тяжелее для поддержания и более сильно связанный, чем это должно было быть. Кроме того, хорошо знать обе стороны аргумента шаблонов. Хорошее знание шаблона должно быть закруглено с (часто рассматривал шаблон, самостоятельно) антишаблон знание, также.

104
задан the Tin Man 21 April 2016 в 16:16
поделиться

5 ответов

"Правильный" - опасное слово в 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" до чел.

95
ответ дан 24 November 2019 в 04:09
поделиться

Вы можете переопределить конструктор для модели 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
-3
ответ дан 24 November 2019 в 04:09
поделиться

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

Там есть несколько подходов к этому, этот плагин выглядит интересным вариантом.

1
ответ дан 24 November 2019 в 04:09
поделиться

Вероятно, предложение переопределить новую / инициализацию неполное. Rails будет (часто) вызывать allocate для объектов ActiveRecord, а вызовы allocate не приводят к вызовам инициализации.

Если вы говорите об объектах ActiveRecord, обратите внимание на переопределение after_initialize.

Эти сообщения в блоге ( не мой) полезны:

Значения по умолчанию Конструкторы по умолчанию не вызываются

[Edit: SFEley указывает, что Rails действительно смотрит на значение по умолчанию в базе данных, когда создает экземпляр нового объекта в памяти - я этого не осознавал.]

1
ответ дан 24 November 2019 в 04:09
поделиться

Если вы имеете в виду объекты ActiveRecord, у вас есть (более) два способа сделать это:

1. Используйте параметр: default в БД

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

2. Используйте обратный вызов

EG before_validation_on_create

Подробнее здесь: http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html#M002147

7
ответ дан 24 November 2019 в 04:09
поделиться
Другие вопросы по тегам:

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