4

我对 Rails 中的 STI 有点困惑。

我的情况:我有一个Contact具有字符串字段的模型descriptiondata用于存储一些联系人,如电话、传真、电子邮件等。

现在,当我有一些特定的联系人类型(例如电子邮件地址的电话号码)时,我想以不同的方式验证数据格式,并且我想对输出进行一些不同的格式化。

我决定使用 STI,因为所有模型都有相同的数据,只是行为不同。我对表单和 CRUD 操作有一些疑问,因为我不想违反 Rails 约定。

  1. 如何使用模型类型制作下拉列表?我应该对其进行硬编码还是有一些更自动化的方式?

  2. 如何创建记录?我应该使用switch语句并根据收到的类型创建相应实例的新模型吗?

  3. 如果我要更改模型类型,我应该如何更新它?将对象转换为新类?还是创建一个新对象并销毁前一个对象?

我将非常感谢您的帮助!

4

2 回答 2

2
  1. 是的,应该做一个硬核,因为您的 STI 模型没有默认存储。
  2. 一般来说,是的。但是使用 Rails,您可以只使用camelize.constantize从字符串中获取类。另一种方法是使用父模型,并type手动设置字段。与STI所有记录都在同一个表中一样,然后所有记录都属于父类。
  3. 如果您想更新,只需更新type字段。然后您可以重新查询以强制 Rails 获取不同类型的新对象。
于 2012-07-20T11:58:00.207 回答
0

您可以创建这样的模型:

Type < ActiveRecord::Base
  has_many :contacts
end

您可以使用此命令rails g model Type name:string,在您的联系人中添加一type_id列并迁移数据库。

end 像这样更改联系人的模型:

Contact < ActiveRecord::Base
  belongs_to :type
end

现在,在您的表单中,您可以使用它:

select("type", "type_id", Type.all.collect {|t| [ t.name, t.id ] }, { :include_blank => true })

它应该可以解决您的问题。

现在你可以做这样的事情:

@emails = Type.find_by_name('email').contacts

或者使用范围。

于 2012-07-20T11:51:42.597 回答