Rails在rename_column之后查找并替换属性的实例

时间:2014-11-19 15:13:01

标签: ruby-on-rails ruby replace grep rename

我环顾四周并没有找到一个优雅的解决方案,所以我想我会问。

我正在重构几个数据库表,以使我的命名方案在整个应用程序中保持连续。我的流程目前是这样的:

创建迁移以重命名一堆列:

class RenameSomeAttributes < ActiveRecord::Migration
  def change
    rename_column :some_tables, :old_name, :new_name
  end
end

在我的其余代码中替换它们之前保存:old_name实例的记录。 (可选)

$ grep -r old_name app lib spec >> find-replace-history.txt

查找并替换我的模型,视图,控制器,javascripts,样式表,规格,rake任务等中的字符串。

$ grep -rl old_name app lib spec | xargs sed -r 's/old_name/new_name/g'

但是,此方法仅在我使用仅特定于我正在调整的表的属性名称时才有用。对于更一般的属性名称(:name,:description等),我不得不手动编辑文件以避免替换错误的表的属性。

我是否应该使用更好的工具来帮助我找到属性的每个实例,并且只在属性应用于特定表时才替换它?我不介意单独调整资产,因为他们不知道我指的是哪个表。但是,Rails应该能够确定给定属性是否属于我在所有ruby文件中调整的表。

1 个答案:

答案 0 :(得分:1)

我不认为有这样的工具。你必须手动完成,因为你现在正在做。但是,如果某个旧属性名称仍在某处使用,则可以防止其破坏您的代码。

SomeTable模型中,实施method_missing方法

def method_missing(method, *arguments, &block)
  if method.to_s == "old_name"
    self.new_name
  else
    super
  end
end

要了解method_missing的工作原理,请查看this article,建议您也应该实施respond_to?方法。

您可能希望将以下内容添加到上面的method_missing方法中(在if语句后添加)。

Rails.logger.debug caller.join("\n")

这将显示仍引用旧属性名称的代码。希望这会有所帮助。