我目前正在研究一种产品,在某些原因下,我们决定销毁特定表中的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
子句可以用许多不同的方式编写,因此可以在代码源中进行搜索并更新所有其中的效率不足以覆盖所有情况。
[如果有人遇到类似的情况并设法解决,从而节省了我们的时间和错误,我将很高兴听到您采取什么方法。
谢谢。
Rails版本:'5.2.3'
为了确保还同时委派了所有使用email列的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
。然后,一旦您的应用程序顺利运行且没有错误,请删除该列。