在Rails / ActiveReocrd中有一种方法可以将一个实例替换为另一个实例,以便解析所有关系/外键。
我可以想象这样的事情:
//setup
customer1 = Customer.find(1)
customer2 = Customer.find(2)
//this would be cool
customer1.replace_with(customer2)
假设customer1配置错误,有人已经离开并创建了customer2,不知道customer1,能够快速将所有内容设置为客户2会很好
所以,这也需要更新任何外键
用户belongs_to:客户 网站belongs_to:customer
然后任何具有外键customer_id = 1的用户/网站将通过此'replace_with'方法自动设置为2
这样的事情存在吗?
[我可以想象一个涉及Customer.reflect_on_all_associations(:has_many)等的黑客攻击]
干杯, Ĵ
答案 0 :(得分:1)
这样的事情可能有用,虽然可能有更合适的方式:
已更新:更正了关联示例中的一些错误。
class MyModel < ActiveRecord::Base
...
# if needed, force logout / expire session in controller beforehand.
def replace_with (another_record)
# handles attributes and belongs_to associations
attribute_hash = another_record.attributes
attribute_hash.delete('id')
self.update_attributes!(attribute_hash)
### Begin association example, not complete.
# generic way of finding model constants
find_model_proc = Proc.new{ |x| x.to_s.singularize.camelize.constantize }
model_constant = find_model_proc.call(self.class.name)
# handle :has_one, :has_many associations
have_ones = model_constant.reflect_on_all_associations(:has_one).find_all{|i| !i.options.include?(:through)}
have_manys = model_constant.reflect_on_all_associations(:has_many).find_all{|i| !i.options.include?(:through)}
update_assoc_proc = Proc.new do |assoc, associated_record, id|
primary_key = assoc.primary_key_name.to_sym
attribs = associated_record.attributes
attribs[primary_key] = self.id
associated_record.update_attributes!(attribs)
end
have_ones.each do |assoc|
associated_record = self.send(assoc.name)
unless associated_record.nil?
update_assoc_proc.call(assoc, associated_record, self.id)
end
end
have_manys.each do |assoc|
associated_records = self.send(assoc.name)
associated_records.each do |associated_record|
update_assoc_proc.call(assoc, associated_record, self.id)
end
end
### End association example, not complete.
# and if desired..
# do not call :destroy if you have any associations set with :dependents => :destroy
another_record.destroy
end
...
end
我已经列举了一个关于如何处理某些关联的示例,但总的来说这可能会变得棘手。