如何将ActiveRecord表名转换为模型类名

发布于 2024-11-10 01:46:29 字数 205 浏览 0 评论 0原文

是否有可能将 ActiveRecord 表名正确转换为模型类名?我发现了一种 hack

def model_for_table(table_name)
  table_name.classify.constantize
end

,但由于我们对许多模型使用 set_table_name ,所以这不起作用。有什么办法可以做到吗?

Is there any possibility to properly convert ActiveRecord table name to model class name? I have found one hack

def model_for_table(table_name)
  table_name.classify.constantize
end

but since we use set_table_name for many of our models this wont work. Is there any way to do it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

乜一 2024-11-17 01:46:29

我做到了!

这将返回“table_name”=> 形式的哈希值。 “模型_类_名称”。

Hash[ObjectSpace.enum_for(:each_object, class << ActiveRecord::Base; 
    self; end).to_a.reject{|c| c == ActiveRecord::Base}.collect{
    |c| [c.table_name, c.name]}]

编辑:更好的版本(仅适用于 Rails 3):

Hash[ActiveRecord::Base.send(:descendants).collect{|c| [c.table_name, c.name]}]

请注意,并非所有模型类都始终加载。要在创建这样的哈希之前加载它们,请执行以下操作:

Dir.foreach("#{RAILS_ROOT}/app/models") { |f| require f if f =~ /.*\.rb/ }

很好。

I did it!

This returns a hash in the form of "table_name" => "model_class_name".

Hash[ObjectSpace.enum_for(:each_object, class << ActiveRecord::Base; 
    self; end).to_a.reject{|c| c == ActiveRecord::Base}.collect{
    |c| [c.table_name, c.name]}]

EDIT: Better version (works with Rails 3 only):

Hash[ActiveRecord::Base.send(:descendants).collect{|c| [c.table_name, c.name]}]

Please note not all your model classes are always loaded. To load them all before creating such a hash do this:

Dir.foreach("#{RAILS_ROOT}/app/models") { |f| require f if f =~ /.*\.rb/ }

Nice.

一江春梦 2024-11-17 01:46:29
ObjectSpace.each_object(Class).select{ |klass| 
  klass < ActiveRecord::Base 
}.index_by(&:table_name)

虽然这不是世界上最快的事情

ObjectSpace.each_object(Class).select{ |klass| 
  klass < ActiveRecord::Base 
}.index_by(&:table_name)

It is not the fastest thing in the world though

不离久伴 2024-11-17 01:46:29

在 Rails 3 中可以这样做:

ActiveRecord::Base.descendants.collect{|c| [c.table_name, c.name]}

Can do like this in rails 3:

ActiveRecord::Base.descendants.collect{|c| [c.table_name, c.name]}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文