Установка связанных идентификаторов в Rails - PullRequest
0 голосов
/ 20 сентября 2009

У меня есть изображение, belongs_to для пользователя и двоичного файла (физические атрибуты файла хранятся в отдельной модели). В старые времена (читай: вчера) я установил значение user_id вручную:

@image = Image.new( params[:image] )
@image.user_id = current_user

Мой друг недавно сообщил мне, что вместо этого я должен использовать ассоциации, поэтому мой код контроллера стал:

@image = current_user.image.new( params[:upload] )

Это, конечно, намного приятнее и прекрасно работает. Теперь я хотел бы сделать что-то подобное для моей бинарной ассоциации, но я не знаю как. Извлечение и хранение моего двоичного файла выполняется классом BinaryObserver, который соблюдает модель Image. В обратном вызове before_validation наблюдателя загруженный файл отправляется в класс Binary и создается / сохраняется двоичный объект. После сохранения мне нужно установить значение binary_id для моей модели изображения. Я делал это вручную, но теперь я чувствую, что должен делать это по-другому. Вот что у меня в BinaryObserver#before_validation:

def before_validation( model )
  binary          = Binary.new.upload( model.upload ) rescue raise
  binary          = binary.store()
  model.binary_id = binary.id
rescue => e
  #
  # Rethrow any exception that was raised.
  #
  raise
end

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

Спасибо.

Rob

Ответы [ 2 ]

0 голосов
/ 21 сентября 2009

Есть ли у вас отношение has_one / assign_to для Image / Binary? Это также может пригодиться ...

0 голосов
/ 21 сентября 2009

Мне кажется, я понял правильный ответ. Вместо того, чтобы устанавливать переменную для хранения только что созданного экземпляра Binary, я устанавливаю саму ассоциацию:

model.binary = Binary.new.upload( model.upload ) rescue raise

Кажется, это именно то, что я хотел. Он автоматически устанавливает значение внешнего ключа, а также позволяет мне напрямую воздействовать на связанный объект.

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