ruby-on-rails - 如何从字符串中获取模型类?

标签 ruby-on-rails ruby class polymorphism

我有一个名为 Todo.rb 的模型,它有一个名为“asset”的属性,它是一个字符串。该字符串包含模型的名称,例如 CallEmail 等。

它们还包含一个asset_id,这是Asset在ActiveRecord中的具体记录。

如何从 Todo 记录中分配给实际 ActiveRecord 类的 asset

=> #<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 相当于:

 asset = Call.find(2)

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

最佳答案

我明白你想在这里做什么,而且有一种更简单的方法可以做到这一点。这叫做多态性。您希望待办事项能够属于不止一种类型的事物 - 有时是电话,有时是电子邮件,等等。好消息是,你已经很接近了。设置方法如下。

在您的迁移中,将“asset”字段重命名为“asset_type”:

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 字符串列和一个 asset_id 整数列。并且你指定它属于多态关联,如上所示。然后,在所有可以有很多待办事项的模型中,添加 :as => :asset 部分来告诉它 Rails 如何找到关联的待办事项。

这非常简单,现在它就像其他 has_many 一样工作。希望对您有所帮助!

更新:这是我写的一篇文章,不仅在模型级别,而且在整个站点的表单中说明了多态性:

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

关于ruby-on-rails - 如何从字符串中获取模型类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4093161/

相关文章:

ruby-on-rails - 使用 Hotwire Rails 广播到用户的 Turbo Stream

ruby-on-rails - Arel::Table @aliases 在 Rails 5 中使用时内存泄漏

ruby-on-rails - 启动 rails 时 bundler 中的 Minitest 4.7.5 错误

ruby - 在 Cucumber 中添加 Sinatra 助手

ruby - 正则表达式的 o 修饰符是什么意思?

c++ - 我在堆栈中的 pop 方法有什么问题?

javascript - 为什么我的 ruby​​ 代码不能插入我的 javascript 文件?

ruby - Mongoid 还是 MongoMapper?

java - 增加一个整数的 int 值?

javascript - 动态子 React 的类名