Как построить ассоциацию ActiveRecord, прежде чем родительский объект имеет идентификатор? - PullRequest
1 голос
/ 30 июля 2010

У меня есть модель, Фу, у которой есть множество баров. У него есть виртуальный атрибут current_baz, который возвращает атрибут baz самого последнего бара из ассоциации (если он существует). Я хотел бы определить Foo.current_baz = так, чтобы можно было сказать my_foo.update_attributes (: current_baz => 7), и, в частности, я хотел бы, чтобы он работал при создании нового Foo. Таким образом, я могу сказать

Foo.new(:current_baz => 7, ...)

и это должно сделать

self.bars.build(:baz => 7)

Конечно, это не работает, потому что у нового Foo еще нет идентификатора, и поэтому новый Bar недействителен. Я знаю, как обойти это в контроллере, создавая сначала Foo, а затем Bar и объединяя оба в транзакции. Но я бы очень хотел сохранить эту логику в модели, если это возможно. Кажется почти возможно. У кого-нибудь есть предложения?

1 Ответ

1 голос
/ 31 июля 2010

Есть несколько способов сделать это, но один из способов, которые я делал в прошлом (особенно, если вы можете полагаться на наличие только одного нового объекта bar за один раз, это сделать переменную экземпляра для несохраненного баравнутри foo. Итак, чтобы набросать это, вы бы сказали:

if self.new?
  @new_bar = bar.new
  @new_bar.baz = new_current_baz_value
else
  self.bars.build(:baz => 7)
end

Затем вы добавляете обработчик after_save, который говорит:

if @new_bar
  @new_bar.foo = self
  @new_bar.save
  @new_bar = nil
end

Затем, наконец, когда вывызовите current_baz, вам нужно проверить существование new_bar, например так:

if @new_bar
  return @new_bar.baz
else
  return self.bars.last.baz
end

Имеет ли это смысл?

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