代码之家  ›  专栏  ›  技术社区  ›  Satchel

如何从字符串中获取模型类?

  •  1
  • Satchel  · 技术社区  · 15 年前

    我有个模特叫 Todo.rb asset “这是一根绳子。字符串包含模型的名称,如 Call , Email 等等。

    asset_id ,它是ActiveRecord中资产的特定记录。

    资产 从实际的ActiveRecord类?

    => #<Todo id: 165, created_at: "2010-11-04 00:49:45", updated_at: "2010-11-04 00:49:45", contact_id: 49, user_id: 1, asset: "Call", asset_id: 2, original_date: "2010-11-18", current_date: "2010-11-18", done_date: nil>
    

    从这个开始,我想 资产 相当于:

     asset = Call.find(2)
    

    我在概念上理解这可能是单表继承的情况,但我不清楚如何从用例中构建它。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Jaime Bellmyer    15 年前

    我明白你想在这里做什么,有一个简单得多的方法。这叫做多态性。你希望todo能够属于多个类型的东西-有时是一个电话,有时是电子邮件,等等。好消息是,你已经很接近了。这是你如何设置的。

    rename_column :todos, :asset, :asset_type
    

    现在将此添加到模型中:

    class Todo < ActiveRecord::Base
      belongs_to :asset, :polymorphic => true
    end
    
    class Call < ActiveRecord::Base
      has_many :todos, :as => :asset
    end
    
    class Email < ActiveRecord::Base
      has_many :todos, :as => :asset
    end
    

    在将属于许多不同类型对象的类中,有一个asset_type string列和一个asset_id integer列。指定它属于多态关联,如上图所示。然后,在所有可能有很多待办事项的模型中,添加 :as => :asset

    这是很容易的,现在它的工作就像任何其他有很多。我希望这有帮助!

    更新:

    http://kconrails.com/2010/10/19/common-addresses-using-polymorphism-and-nested-attributes-in-rails/

        2
  •  2
  •   Mark Thomas    15 年前

    Rails有一个内置的constantize,它应该可以做到:

    asset = "Call".constantize.find(2)
    

    你也可以使用 Kernel.const_get("Call") eval("Call")

        3
  •  2
  •   Sam å±±    15 年前
     asset = todo.asset.capitalize.constantize.find(todo.asset_id)
    
    推荐文章