我想向Ruby on Rails项目中的所有模型类添加一个属性,该属性将保留在数据库中。我想要的东西就像created_ad和Updated_at属性一样,但是我不知道这是怎么可能的,甚至是不可能的。
我是否必须将属性和列手动添加到我的所有模型中,或者有更好的方法吗?
答案 0 :(得分:2)
您将必须运行一个(或几个)迁移,这会将列添加到所有需要的模型中。没办法解决。
关于如何进行迁移:您仅受您的想象力限制。最简单的方法是简单地手动写出所有迁移,即每个表的迁移。
您还可以编写一个脚本来为您生成迁移文件。或在同一迁移中完成所有操作:只需循环调用add_column
。
答案 1 :(得分:1)
对于现有项目,无法为每个模型生成迁移。通过遍历app/models
中的文件并使用基于rails命名约定的启发式方法来生成迁移,您可能会编写rake任务来实现此目的。
names = Dir.glob(Rails.root.join('app', 'models', '*.rb')).map do |p|
Pathname.new(p).basename.to_s.chomp('.rb')
end.reject {|p| p == "application_record"}
models = names.map { |n| n.classify.constantize }
models.each do |m|
next unless m.ancestors.include?(ActiveRecord::Base)
puts %x{ rails g migration add_foo_to_#{m.table_name} foo:string }
end
这是一个(非常)简化的示例,没有考虑“命名空间”模型或处理错误。
对于未开发的项目或新模型,您可以create your own generators,当您运行标准rails g model
之类的标准rails生成器命令时,它会添加额外的列。