2010-10-14 3 views
1

При создании новых записей. Мне нужно создать больше записей для одной и той же модели.Создание новых записей на before_save

Пример ::

class XYZ < ActiveRecord 
def before_save 
    # At this point object is already initialized .. 
    # And it's containing values. 
    # At this point i want to create 10 more records for the same class. 
    # something like this 
    XYZ.new(:att1 => value1,:att2 => value2,:att3 => self.att1) 
end 
end 

Как я могу справиться с этим типом сценария? На каком обратном вызове мне нужно создать больше записей для одной и той же модели?

+0

Вы хотите, чтобы before_save запускался для * этих * тоже? –

+0

@Mark Thomas Да, проверки и обратный вызов должны быть огнем. –

+0

Как вы планируете остановить бесконечный цикл, созданный before_saves, который вызывается для ваших дополнительных записей, созданных before_saves? –

ответ

2

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

Я бы порекомендовал

class XYZ < ActiveRecord 
def self.create10(original_xyz) 
    10.times do 
    clone = original_xyz.clone 
    clone.save 
    end 
end 
end 

и где в контроллере или там, где у вас есть необходимость в создании более 10, звоните:

new_xyz = XYZ.new(:att1 => value1,:att2 => value2,:att3 => self.att1) 
new_xyz.save 
XYZ.create10(new_xyz) 

, но если вам действительно нужно, чтобы создать более 10 на крюк (например, перед сохранением), do:

class XYZ < ActiveRecord 

before_save create10 

attr_acessor :cloned 

def create10 
    return if cloned # this will prevent infinit loooooooooooooooop 
    10.times do 
    clone = self.clone 
    clone.cloned = true 
    clone.save 
    end 
end 

end 

Я не запускал это, поэтому сначала попробуйте.

0
class XYZ < ActiveRecord 
def after_initialize 
    # At this point object is already initialized .. 
    # And it's containing values. 
    # At this point i want to create 10 moew records for the same class. 
    # something like this 
    #XYZ.new(:att1 => value1,:att2 => value2,:att3 => self.att1) 
    x = 10 #an integer 
    x.times do |task| 
    Model.create(:key => :value) 
    end 
    end 
end 
+0

Но перед созданием других объектов мне нужно проверить валидацию для существующего объекта. И валидации и обратные вызовы должны быть огнем и на других записях. –

+0

Почему вы создаете экземпляры модели? OP хочет новые XYZ. «Задача» также не нужна, как и ссылка на 10. 10.times {} в порядке. –

+0

@Dave У меня есть задача, например, если пользователь войдет в одну запись, чем в фоновом режиме, я должен распространять эту запись еще в 10 строках. Одна строка для введенного пользователя и 10 других строк для рассчитанных. Итак, как я могу справиться с этим типом сценария? –

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