Rails中子类属性的默认值

时间:2016-04-26 20:41:54

标签: ruby-on-rails

在我的架构中说我有一个带有宠物属性字段的用户表,默认为["狗"]:

create_table "users", force: true do |t|
    ...
    t.text    "pets",     default: ["dogs"],    array: true
    ...

我有一个继承自FriendlyUser课程的模型Userclass FriendlyUser < User

因此,当创建FriendlyUser时,类型为&#34; FriendlyUser&#34;。但我希望FriendlyUser将宠物设置为狗和猫的默认值:[&#34;狗&#34;,&#34;猫&#34;]

迁移是否可行,或者必须在课程中完成(通过覆盖initialize方法,使用after_initializebefore_create等)?

2 个答案:

答案 0 :(得分:1)

Rails迁移中的默认值不是用来处理这样的逻辑。从数据库方面来说,可能技术上可能使用触发器根据类型列中的值填充插入数据,但这可能比它更麻烦和复杂。值得。

设置before_validation回调中的值可能是您最好的选择。由于您使用了继承,因此可以覆盖子类中的回调。

答案 1 :(得分:1)

由于STI将一个表用于多个模型,因此数据库层中的默认值将使您的模型更难以具有不同的特征。因此,我认为您应该坚持将默认值逻辑移动到您可以定义模型特定行为的应用程序逻辑。