2009-04-02 5 views
2

У меня есть пара моделей, которые связаны с парой has_manybelongs_to. Для демонстрации клиент имеет один сервер, но на сервере много клиентов. Я мог бы сделать что-то вроде этого:Можете ли вы принудительно активировать ассоциации activerecord, не сохраняя их?

client1.server = the_server 
client2.server = the_server 
client3.server = the_server 

Моя фактическое применение совсем немного сложнее, чем это, но пример будет работать для иллюстрации.

Я хочу проверить ассоциации между этими объектами, прежде чем я их сохраню. ActiveRecord не обновляет свою информацию до тех пор, пока не будет сохранен. В приведенном выше примере the_server понятия не имеет, кто client1, client2, или client3, пока один из них не будет спасен. Я уверен, что это помогает эффективности active_record, но он оставляет экземпляры модели в памяти в несогласованном состоянии.

Есть ли что-нибудь, что я могу позвонить клиентам или на сервере, которые заставят их обновить свои состояния?

+0

3 с половиной года, и у меня такая же проблема, но в моем случае модели могут стать непоследовательными. Что-нибудь добавить? –

ответ

1

Позвоните #reload об объектах, чтобы их обновить.

+1

Для этого сначала нужно сохранить объекты, не так ли? reload говорит, чтобы получить информацию из db снова. Если клиент1,2 и 3 не сохраняются, их не нужно перезагружать. – srboisvert

+0

Это мое понимание, также. Я не хочу обновляться из БД - совсем наоборот: я хочу, чтобы объекты обновлялись, как будто они были сохранены. – Sniggerfardimungus

+0

Это ОГРОМНЫЙ анти-шаблон, который указывает на то, что моделирование имеет проблемы. используйте 'clear_association_cache', если вы хотите, чтобы объект перезагружал связанные объекты, потому что текущие ассоциации устарели. перезагрузка сама по себе может создавать бесконечные циклы, а также, как правило, вызывается 5 раз в одном запросе, потому что «вы просто не уверены», если объект был перезагружен в зависимости от контроллера/модели, в которой вы находитесь в вашем коде – drhenner

0

Если вы начинаете так:

client1 = the_server.clients.build(:name => 'a client', ...) 

Тогда вы должны получить то, что вы ищете, я думаю.

EDIT:

К сожалению, я перечитал свой пост и понял, что the_server не были либо сохранены. В этом случае возможно:

client1.server = the_server 
the_server.clients << client1 

(помните, что это позволит сэкономить CLIENT1, если the_server уже сохранен)

или:

the_server.clients.build(:name => 'some client', ..., :server => the_server) 

Немного излишним, так, возможно, есть лучший выход есть ,

0

Если вы используете обратный путь создания ассоциации, то вы можете посмотреть на модели перед ними сохраняются:

the_server.clients << client1 
the_server.clients << client2 
the_server.clients << client3 

Заметим, однако, что вы можете только позвонить client1.server сразу после того, как если the_server уже существует.