Rails: установить значение по умолчанию, совпадающее с идентификатором записи - PullRequest
1 голос
/ 12 января 2012

В моей таблице есть столбец "порядок", который я хочу изначально установить равным идентификатору записи.

Могу ли я сделать это в процессе миграции или мне нужно установить это в действии создания?

Ответы [ 2 ]

3 голосов
/ 12 января 2012

Если у вас уже есть данные, вы не можете сделать это в действии обратного вызова create, поскольку эти элементы уже созданы.Однако обратный вызов create поможет вам создать новые объекты, которые вы создадите:

after_create :set_order_attribute

def set_order_attribute
  self.update_columns(order: id) if order.nil?
end

Вы можете технически обновить существующие данные в миграции как оператор SQL, но я бы не рекомендовал использовать команды, включающие модель ActiveRecordпоскольку миграция может когда-нибудь прерваться по мере изменения модели.Чтобы сделать это в процессе миграции, вы должны иметь команду execute в методе: up (не знаете, какое поведение вы хотели бы: down), например так:

def up
  table_name = "foo"
  execute "UPDATE #{table_name} SET order = id;"
end

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

0 голосов
/ 12 января 2012

Я думаю, что значение, переданное в: default в миграции, не может быть переменной.Я бы попробовал перезвонить так:

    before_save :initialize_order

    def initialize_order
      self.order = self.id
    end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...