Rails,从表中删除列并将其委托给关联的表,并在where子句中使用委托列

我目前正在开发一种产品,在某些原因下,我们决定销毁特定表中的email列,然后使用活动记录委托方法将该列委托给关联的表

https://apidock.com/rails/Module/delegate

我在这里的问题是要确保采用email列的所有where子句也都得到委派的遵循的方法是什么。因为基本上需要很多时间来检查我们使用过table.where(dropped_column: value)的所有地方

示例

class Station < activeRecord::Base
  has_one :contact
  delegate :email,to: :contact
end

class Contact < activeRecord::Base
  belongs_to :station
end

我知道可以将所有查询从Station.where(email: value)切换到Station.joins(:contact).where('contacts.email': value),但是这种方法将花费很长时间,而且where子句可以用许多不同的方式编写,因此搜索在整个代码源中进行更新,并不足以覆盖所有情况。

如果有人遇到类似情况并设法解决,从而节省了我们的时间和错误,那么我将很高兴听到您采取什么方法。

谢谢。

轨道版本:“ 5.2.3”

cry1018 回答:Rails,从表中删除列并将其委托给关联的表,并在where子句中使用委托列

要确保所有使用电子邮件列的where子句也都被委派,应该采取什么方法

您不能“委托” SQL命令。您需要全部更新。

我知道可以将所有查询从Station.where(email: value)切换到Station.joins(:contact).where('contacts.email': value),但是这种方法将花费很长时间

是的,那是您需要做的,对不起!

如果有人遇到类似情况并设法解决了这一问题,从而节省了我们的时间和错误,那么我将很高兴听到您遵循的方法。

删除列之前,您可以先执行以下操作:

class Station < ActiveRecord::Base
  self.ignored_columns = ['email']

  has_one :contact
  delegate :email,to: :contact

  # ...
end

这样,您可以阻止应用程序访问该列,而无需实际将其从数据库中删除(例如“软删除”),从而使还原变得容易。

在分支上执行此操作,并使所有规格变为绿色。 (如果您具有良好的测试覆盖率,那么您就完了!但是如果覆盖率很差,则部署后可能会出现错误...)

如果部署后出现问题,您可以 还原整个PR,或者在推送修订时暂时暂时将ignored_columns注释掉。

最后,一旦您的应用程序顺利运行且没有错误,请删除该列。

本文链接:https://www.f2er.com/2383046.html

大家都在问