2008-10-03 4 views
0

У меня есть приложение, в котором attr_accessor используется для хранения временных данных для модели, которая будет передана команде rake. Видя, что для этих атрибутов нет поля базы данных, и они не вычисляются из данных базы данных, будут ли данные attr_accessor сохраняться и быть доступными для задачи рейка? Что произойдет, если мне нужно перезапустить сервер - потеряются ли данные, если они не сохранены в базе данных? Или, чтобы избавиться от этого, мне нужно либо сохранить временный файл, либо поле базы данных?Сохранение атрибута attr_accessor не-DB в Rails

ответ

7

Я предполагаю, что вы спрашиваете, будут ли доступны данные, хранящиеся в атрибутах объектов ActiveRecord, связанных с веб-запросами, при доступе к ним через задачу Rake?

Нет. Они не будут. Эти данные даже не будут доступны для следующего веб-запроса. Эти данные даже не будут присутствовать, если вы дважды загрузите одну и ту же запись.

class Thing < ActiveRecord::Base 
    attr_accessor :data 
end 

#try this in script/console 
thing = Thing.find(:first) 
thing.data = "Something" 
thing = Thing.find(:first) 

puts thing.data 
-> nil 
+0

Если `data` есть двоеточие перед ним? Что такое различие? – 2012-10-02 18:01:26

-3

Конечно, это будет потеряно, где, по вашему мнению, данные идут, когда он умирает? К данным h (e) aven, откуда он всегда может вернуться?

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

-1

Это зависит от того, как вы передаете свои данные в задачу рейка и почему. Если вы пытаетесь выполнить работу вне диапазона с запросом, а это означает, что пользователь не дожидается до полного завершения, я рекомендую ознакомиться с превосходным скринкастом Райана здесь http://railscasts.com/episodes/128-starling-and-workling, чтобы узнать о очередях заданий.

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

Используя пример Даниила сверху:

вещь = Thing.find (: первый) thing.data = "Что-то"

rake myraketask thing_id=#{thing.id} data=#{thing.data}

Смежные вопросы