Ruby on rails ActiveRecord根据表B中相应的列更新表A中的列

Ruby on rails ActiveRecord根据表B中相应的列更新表A中的列,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,如果没有任何原始SQL,我希望能够使用ActiveRecord迁移执行特定的非规范化。我正在一个表中创建一个新的未填充列: add\u列:table\u A,:some\u data,:integer,:default=>nil 现在,:table_A已经引用了:table_B,通过在:table_B的模型类中有许多:表B也已经有了:一些数据列。我想做的是让:table_A的:一些_data列填充相应:table_B行中相同列中的值(编辑:一次,在一次迁移中,而不是连续),而不使用循环(我希望生

如果没有任何原始SQL,我希望能够使用ActiveRecord迁移执行特定的非规范化。我正在一个表中创建一个新的未填充列:

add\u列:table\u A,:some\u data,:integer,:default=>nil

现在,
:table_A
已经引用了
:table_B
,通过
:table_B
的模型类中有许多
<代码>:表B也已经有了
:一些数据列。我想做的是让
:table_A
:一些_data
列填充相应
:table_B
行中相同列中的值(编辑:一次,在一次迁移中,而不是连续),而不使用循环(我希望生成的更新操作是一条语句)。我试图浏览ActiveRecord文档以确定如何执行此操作,但结果是空的

指示我如何执行更新,其中接收器是单个表,但我看不到如何从另一个表中的对应行提取数据。向我指示如何在AR中执行联接,但我看不到如何随后对结果数据集执行更新,因为我不知道如何区分参数to
update\u all
中的两个表。也就是说,如果我写
TableA.joins(:table_b).update_all(…)
,我应该在那里放置什么来代替

编辑:这项任务有一套非常奇怪的限制条件,我不喜欢在这些条件下工作。如果我能改变环境,使它们不在适当的地方,我会这样做,但我不能。(老实说,如果是那样的话,我会完全去掉铁轨。)

我们在开发和QA环境中使用AR迁移,但在登台和生产环境中手动运行SQL。(不,我也不理解这个决定,但我无法控制它。)这意味着我希望在AR迁移中写入的任何内容都能决定性地生成相同的SQL,而不管生成SQL时数据库中存在什么数据(通过lol_dba gem),这反过来意味着没有循环,因为生成的SQL依赖于数据


在我看来,从这些答案和其他研究来看,这意味着我需要单独编写SQL来执行所需的数据传播,而不是将其作为迁移的一部分。如果我们不是在这种奇怪的设置中,生产部门使用生成的SQL进行迁移,那么这项任务会简单得多,基本上任何发布的答案都可以满足要求。

您可以在rails控制台或rake任务中完成这项任务,而不是迁移:

  TableA.all.map{ |a| a.update(some_data: a.table_b.some_data) }
e、 g.如果
表格A
儿童
表格B
父亲
一些东西
国籍

  Child.all.map{ |child| child.update(nationality: child.father.nationality) }

对于进一步创建
TableA
,您肯定需要在controller(正确的方式)或model中处理它。

为什么您需要不使用原始SQL或循环?Rails迁移通常仅用于DDL(尽管这是一种观点)。鉴于这些要求,我看不到一种方法可以实现您所寻找的目标。如果您利用Rails关联(但是使用循环),有一个简单的解决方案不使用原始SQL。如果它涉及原始SQL,我将只编写SQL并完全跳过Rails,这就是我现在的退路。我不需要循环,因为我不希望迁移导致对表中的每一行执行单独的更新操作。对不起,您避免使用循环的原因是什么?这是性能问题吗?或者您不想在
列中无用地更改
updated\u?只是为了更好地了解你的需求。我给出的是更好的解决方案。这可能会在你想要的方式上帮助你,但我想这不是一件好事:在一天结束时,update_all、each和map都是循环。