create_attribute перед сохранением в Rails 3.1 не устанавливает self.attribute_id - PullRequest
3 голосов
/ 22 июня 2011

Старый код, работающий в Rails 3.0:

belongs_to :primary_stream

before_save :autocreate_primary_stream, :if=>lambda {|a| a.primary_stream.nil?}

def autocreate_primary_stream
  self.create_primary_stream()
end

В Rails 3.1: self.primary_stream заполнено, а self.primary_stream_id равно нулю. Когда запись сохранена, primary_stream_id сохраняется как ноль в базе данных.

Я должен был сделать это, чтобы получить поведение, которое я ожидал:

belongs_to :primary_stream

before_save :autocreate_primary_stream, :if=>lambda {|a| a.primary_stream.nil?}

def autocreate_primary_stream
  self.create_primary_stream()
  self.primary_stream_id = primary_stream.id
end

Что-то изменилось или я сделал что-то очень глупое?

1 Ответ

2 голосов
/ 23 июня 2011

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

Тем не менее, функция автосохранения ассоциации в 3.1 дает более чистый способ достижения этого -

belongs_to :primary_stream

before_validation :autocreate_primary_stream, :if=>lambda {|a| a.primary_stream.nil?}

def autocreate_primary_stream
  self.build_primary_stream()
end

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

https://github.com/rails/rails/issues/1594 был несколько уместен.

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