Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails,从表中删除列并将其委托给关联表,并在where子句中使用委托列_Ruby On Rails_Ruby_Activerecord_Rails Migrations_Ruby On Rails 5.2 - Fatal编程技术网

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

Ruby on rails Rails,从表中删除列并将其委托给关联表,并在where子句中使用委托列,ruby-on-rails,ruby,activerecord,rails-migrations,ruby-on-rails-5.2,Ruby On Rails,Ruby,Activerecord,Rails Migrations,Ruby On Rails 5.2,我目前正在开发一个产品,在某些情况下,我们决定销毁特定表中的电子邮件列,然后使用活动记录委托方法将该列委托给关联表 我在这里的问题是,为了确保所有使用电子邮件列的where子句也都被委派,应该采取什么方法。因为检查我们使用table.wheredrop\u column:value的所有位置基本上需要很多时间 范例 我知道可以将所有查询从Station.whereemail:value切换到Station.joins:contact.where'contacts.email':value,但这种

我目前正在开发一个产品,在某些情况下,我们决定销毁特定表中的电子邮件列,然后使用活动记录委托方法将该列委托给关联表

我在这里的问题是,为了确保所有使用电子邮件列的where子句也都被委派,应该采取什么方法。因为检查我们使用table.wheredrop\u column:value的所有位置基本上需要很多时间

范例

我知道可以将所有查询从Station.whereemail:value切换到Station.joins:contact.where'contacts.email':value,但这种方法需要很长时间,而且where子句可以以多种不同的方式编写,因此搜索代码源并更新所有代码的效率不足以覆盖所有查询案例

如果有人遇到了类似的情况,并设法以节省我们时间和缺陷的方式解决了问题,我将非常高兴地听到您采用了哪些方法

谢谢

Rails版本:“5.2.3”

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

不能委派SQL命令。你需要全部更新它们

我知道可以将所有查询从Station.whereemail: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,或者在推送修复程序的同时临时注释掉忽略的_列


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

这是有效的,因为除非执行原始SQL,否则rails不会!从表_name中选择*获取数据;相反,它总是显式地声明每一列,如从表\u name中选择表\u name.col1、表\u name.col2、表\u name.col3。因此,如果您告诉rails显式忽略某个列,那么任何引用该列的SQL查询都应该失败。在删除该列之前,忽略该列是一种软删除该列的好方法。
class Station < ActiveRecord::Base
  self.ignored_columns = ['email']

  has_one :contact
  delegate :email, to: :contact

  # ...
end