Создайте экземпляр модели Rails с предварительно заполненной ассоциацией has_many - PullRequest
2 голосов
/ 05 июля 2010

Это лучше всего объяснить на примере.Следующее легко сделать:

class Foo < ActiveRecord::Base
  has_many :bars
end

1a>> foo = Foo.new
=> #<Foo id: nil>
2a>> foo.bars << Bar.new
=> [#<Bar id: nil, foo_id: nil>]
3a>> foo.bars
=> [#<Bar id: nil, foo_id: nil>]

Однако я хочу, чтобы все объекты Foo инициализировались с помощью Bar без необходимости явно запускать строку 2:

class Foo < ActiveRecord::Base
  has_many :bars

  # [...] Some code here
end

1b>> foo = Foo.new
=> #<Foo id: nil>
2b>> foo.bars
=> [#<Bar id: nil, foo_id: nil>]

Возможно ли это?В идеале объект «по умолчанию» будет по-прежнему ассоциироваться таким же образом, как если бы я явно запускал строку 2а, чтобы он сохранялся при сохранении родительского объекта Foo.

Ответы [ 2 ]

2 голосов
/ 05 июля 2010

Позвольте мне предварить это, сказав, что с точки зрения дизайна, это, вероятно, не самая лучшая идея.Предполагая, что ваш код намного сложнее, чем Foo и Bar, вы можете направиться к чему-то более похожему на строитель.

Однако, если вы настаиваете на том, что просите, этосделаю это.

class Foo < ActiveRecord::Base
  has_many :bars

  def after_initialize 
    self.bars << Bar.new if self.new_record?
  end 
end
1 голос
/ 05 июля 2010

по идее, это не самый чистый способ сделать что-то подобное, потому что вы смешиваете логику модели внутри другой.

есть еще кое-что: у вас еще нет экземпляра во время инициализации, поэтому я думаю, что это невозможно.

имейте в виду, что если вам нужно сохранить связанные объекты, вы можете сделать это в контроллерах или с помощью форм Nested Models Forms

Какую задачу вам нужно достичь?

...