我有一个名为 Todo.rb
的模型,它有一个名为“asset
”的属性,它是一个字符串。该字符串包含模型的名称,例如 Call
、Email
等。
它们还包含一个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/