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

Да, это возможно. Один из способов сделать это (что справедливо даже при недавних изменениях noexcept) - использовать правила сужения конверсии C ++ 11:

A сужение преобразования представляет собой неявное преобразование [...] из целочисленного типа или неперечисленного типа перечисления в целочисленный тип, который не может представлять все значения исходного типа, за исключением случаев, когда источником является постоянное выражение, значение которого после того, как целые акции будут вписываться в тип цели.

blockquote>

(акцент мой). Инициализация списка обычно запрещает сужение конверсий, и в сочетании с SFINAE мы можем создавать гаджеты для определения того, является ли произвольное выражение постоянным выражением:

// p() here could be anything
template std::true_type is_constexpr_impl(decltype(int{(p(), 0U)}));
template std::false_type is_constexpr_impl(...);
template using is_constexpr = decltype(is_constexpr_impl

(0)); constexpr int f() { return 0; } int g() { return 0; } static_assert(is_constexpr()); static_assert(!is_constexpr());

Живая демонстрация .

Ключ здесь состоит в том, что int{(expr, 0U)} содержит сужение преобразования от unsigned int до int (и, следовательно, плохо сформировано), , если expr не является постоянным выражением, в в этом случае все выражение (expr, 0U) является константным выражением, оцениваемое значение которого соответствует типу int.

404
задан meagar 25 September 2013 в 14:46
поделиться

6 ответов

<забастовка> Это - то, для чего конструкторы! Переопределите метод модели initialize.

Использование after_initialize метод.

4
ответ дан John Topley 25 September 2013 в 14:46
поделиться
  • 1
    +1 Интересный подход, который очень быстр. Но вне факта этот doesn' t компилируют, как (я могу отредактировать его, если Вы хотите), это также doesn' t работа. Так или иначе моя точка, как только Вы разбираетесь в ней, и значение кажется ' посмотрите like' PI, бросьте более глубокий взгляд и you' ll видят последние десятичные числа, которые это дает, довольно неточны и... изменяются для каждого выполнения. двойной версия из документа имеет ту же проблему, но десятичное число каждый не более точен. – Simon Mourier 19 February 2013 в 17:37
class Item < ActiveRecord::Base
  def status
    self[:status] or ACTIVE
  end

  before_save{ self.status ||= ACTIVE }
end
1
ответ дан bbozo 25 September 2013 в 14:46
поделиться
  • 1
    Этот doesn' t соответствуют плаваниям без целой части, например, .123 вместо 0.123. – Martin Scharrer 2 May 2013 в 11:57

У парней Phusion есть некоторые хорошие плагин для этого.

16
ответ дан Milan Novota 25 September 2013 в 14:46
поделиться
  • 1
    Я думаю он редкий случай, когда у Вас должно было бы быть больше точности, чем Вы добираетесь от Математики. PI; – Chris Ballance 12 February 2010 в 23:12

Мы помещаем значения по умолчанию в базу данных посредством миграций (путем определения :default опция на каждом определении столбца) и позволяем Активному Рекордному использованию эти значения для установки значения по умолчанию для каждого атрибута.

, по моему скромному мнению, этот подход выровненный принципов AR: соглашение по конфигурации, DRY, определение таблицы управляет моделью, не наоборот.

Примечание, что значения по умолчанию находятся все еще в приложении (Ruby) код, хотя не в модели, а в миграции (миграциях).

47
ответ дан Laurent Farcy 25 September 2013 в 14:46
поделиться
  • 1
    @jack Это doesn' t имеют условие завершения или возвращаемое значение. Если Вы хотите создать полный рабочий пример, я предлагаю, чтобы Вы отправили новый ответ. См. комментарий в ответе Note that I left out the end condition, to keep it simple. In real life, you kind of need one. – dcaswell 17 October 2013 в 03:53

Хотя для установки значений по умолчанию в большинстве случаев это делать неудобно и непонятно, вы можете использовать :default_scope. Посмотрите комментарий squil здесь.

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

Привет, ребята, в итоге я сделал следующее :

def after_initialize 
 self.extras||={}
 self.other_stuff||="This stuff"
end

Прекрасно работает!

4
ответ дан 22 November 2019 в 23:32
поделиться
Другие вопросы по тегам:

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