如何创建一个将在所有ActiveRecords(Rails)中保留的属性?

时间:2018-07-11 19:01:46

标签: ruby-on-rails ruby

我想向Ruby on Rails项目中的所有模型类添加一个属性,该属性将保留在数据库中。我想要的东西就像created_ad和Updated_at属性一样,但是我不知道这是怎么可能的,甚至是不可能的。

我是否必须将属性和列手动添加到我的所有模型中,或者有更好的方法吗?

2 个答案:

答案 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生成器命令时,它会添加额外的列。