我环顾四周并没有找到一个优雅的解决方案,所以我想我会问。
我正在重构几个数据库表,以使我的命名方案在整个应用程序中保持连续。我的流程目前是这样的:
创建迁移以重命名一堆列:
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文件中调整的表。
答案 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")
这将显示仍引用旧属性名称的代码。希望这会有所帮助。