我有两个表:Admin和Worker。他们有相同的论点(电子邮件,密码等)。
我尝试将包含电子邮件的行:“foo@example.com”从Worker表中删除到Admin表中(并从Worker表中删除)。
我尝试了下一件事:
@email = 'foo@example.com'
@row_email_deleted = Worker.find_by_email(@email)
Admin.add(@row_email_deleted)
@row_email_deleted.destroy
但它不起作用:/
有人可以帮我解决问题吗?
答案 0 :(得分:2)
试试这个:
@email = 'alon@gmail.com'
@worker = Worker.find_by_email(@email)
@new_admin = @worker.becomes Admin
@new_admin.save
@worker.destroy
但我建议你应该尝试重构STI,例如:http://blog.thirst.co/post/14885390861/rails-single-table-inheritance
答案 1 :(得分:1)
除了apneadiving,我不知道'add'方法是由什么组成的。关于究竟什么不起作用而不是很多细节使得很难知道它为什么不起作用。也就是说,忽略所有这些,我会做这样的事情:
Worker.transaction do
@email = 'foo@example.com'
@worker = Worker.find_by_email(@email)
Admin.create(@worker.attributes.reject{|k,v| %w[id].include?(k)})
@worker.destroy
end
将整个内容包装在一个事务中,以确保您不删除该工作者但不添加该管理员。 http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html
'拒绝...'位是删除管理员中不需要的任何工作人员属性(或无法集中传递的工作人员属性)。